被問(wèn)到一個(gè)問(wèn)題:MySQL中varchar最大長(cháng)度是多少?這不是一個(gè)固定的數字。本文簡(jiǎn)要說(shuō)明一下限制規則。
1、限制規則
字段的限制在字段定義的時(shí)候有以下規則:
a) 存儲限制
varchar 字段是將實(shí)際內容單獨存儲在聚簇索引之外,內容開(kāi)頭用1到2個(gè)字節表示實(shí)際長(cháng)度(長(cháng)度超過(guò)255時(shí)需要2個(gè)字節),因此最大長(cháng)度不能超過(guò)65535。
b) 編碼長(cháng)度限制
字符類(lèi)型若為gbk,每個(gè)字符最多占2個(gè)字節,最大長(cháng)度不能超過(guò)32766;
字符類(lèi)型若為utf8,每個(gè)字符最多占3個(gè)字節,最大長(cháng)度不能超過(guò)21845。
若定義的時(shí)候超過(guò)上述限制,則varchar字段會(huì )被強行轉為text類(lèi)型,并產(chǎn)生warning。
c) 行長(cháng)度限制
導致實(shí)際應用中varchar長(cháng)度限制的是一個(gè)行定義的長(cháng)度。 MySQL要求一個(gè)行的定義長(cháng)度不能超過(guò)65535。若定義的表長(cháng)度超過(guò)這個(gè)值,則提示
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。
2、計算例子
舉兩個(gè)例說(shuō)明一下實(shí)際長(cháng)度的計算。
a) 若一個(gè)表只有一個(gè)varchar類(lèi)型,如定義為
create table t4(c varchar(N)) charset=gbk;
則此處N的最大值為(65535-1-2)/2= 32766。
減1的原因是實(shí)際行存儲從第二個(gè)字節開(kāi)始’;
減2的原因是varchar頭部的2個(gè)字節表示長(cháng)度;
除2的原因是字符編碼是gbk。
b) 若一個(gè)表定義為
create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;
則此處N的最大值為 (65535-1-2-4-30*3)/3=21812
減1和減2與上例相同;
減4的原因是int類(lèi)型的c占4個(gè)字節;
減30*3的原因是char(30)占用90個(gè)字節,編碼是utf8。
如果被varchar超過(guò)上述的b規則,被強轉成text類(lèi)型,則每個(gè)字段占用定義長(cháng)度為11字節,當然這已經(jīng)不是“varchar”了。
還可以看看
其他文章,謝謝您的閱讀。
網(wǎng)站申明:系本文編輯轉載,來(lái)源于網(wǎng)絡(luò ),目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責,所有權歸屬原作者。如內容、圖片有任何版權問(wèn)題,請
聯(lián)系我們刪除。