有道面試題:若一張表中只有一個字段VARCHAR(N)類型,utf8編碼,則N最大值爲多少?
先明白計算的一些規則限制面試
4.0版本如下,varchar(20),指的是20字節,若是存放UTF8漢字時,只能存6個(每一個漢字3字節)
5.0版本以上,varchar(20),指的是20字符,不管存放的是數字、字母仍是UTF8漢字(每一個漢字3字節),均可以存放20個,最大大小是65532字節 編碼
① 存儲限制
須要額外地在長度列表上存放實際的字符長度:小於255爲1個字節,大於255則要2個字節
② 編碼限制
gbk:每一個字符最多佔用2個字節
utf8:每一個字符最多佔用3個字節
③ 長度限制
MySQL定義行的長度不能超過65535,這個限制了列的數目,好比char(255) utf8
那麼列的數目最多有65535/(255*3)=85,列的數目能夠從這裏獲得依據
行長度計算公式以下:
row length = 1
+ (sum of column lengths)
+ (number of NULL columns + delete_flag + 7)/8
+ (number of variable-length columns)
① 對於MyISAM,須要額外1個位來記錄值是否爲NULL;對於InnoDB,沒有區別
② 對於row_format爲fixed,delete_flag爲1;對於row_format=dynamic,delete_flag爲0
根據這個公式,咱們便可以解答開頭N的最大值:(65535-1-2)/3
減1是由於實際存儲從第2個字節開始
減2則由於要在列表長度存儲實際字符長度
除3是由於utf8編碼限制
再來一道:
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
N的最大值:(65535-1-2-4-30*3)/3.net
則此處N的最大值爲 (65535-1-2-4-30*3)/3=21812orm
減1和減2與上例相同;blog
減4的緣由是int類型的c佔4個字節;get
減30*3的緣由是char(30)佔用90個字節,編碼是utf8。table
若是被varchar超過上述的b規則,被強轉成text類型,則每一個字段佔用定義長度爲11字節,固然這已經不是「varchar」了form
出處:https://blog.csdn.net/u012048106/article/details/23173911tab