若一張表中只有一個字段VARCHAR(N)類型,utf8編碼,則N最大值爲多少?
先明白計算的一些規則限制
① 存儲限制
須要額外地在長度列表上存放實際的字符長度:小於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 (*int類型佔用4個字節)編碼