《Mysql必讀Mysql varchar大小長(zhǎng)度問(wèn)題介紹》要點(diǎn):
本文介紹了Mysql必讀Mysql varchar大小長(zhǎng)度問(wèn)題介紹,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
4.0版本以下,varchar(20),指的是20字節(jié),如果存放UTF8漢字時(shí),只能存6個(gè)(每個(gè)漢字3字節(jié))
5.0版本以上,varchar(20),指的是20字符,無(wú)論存放的是數(shù)字、字母還是UTF8漢字(每個(gè)漢字3字節(jié)),都可以存放20個(gè),最大大小是65532字節(jié)
Mysql4中最大也不過(guò)是20個(gè)字節(jié),但是Mysql5根據(jù)編碼不同,存儲(chǔ)大小也不同.
1、限制規(guī)則
字段的限制在字段定義的時(shí)候有以下規(guī)則:
a) 存儲(chǔ)限制 varchar 字段是將實(shí)際內(nèi)容單獨(dú)存儲(chǔ)在聚簇索引之外,內(nèi)容開(kāi)頭用1到2個(gè)字節(jié)表示實(shí)際長(zhǎng)度(長(zhǎng)度超過(guò)255時(shí)需要2個(gè)字節(jié)),因此最大長(zhǎng)度不能超過(guò)65535.
b) 編碼長(zhǎng)度限制
字符類(lèi)型若為gbk,每個(gè)字符最多占2個(gè)字節(jié),最大長(zhǎng)度不能超過(guò)32766;
字符類(lèi)型若為utf8,每個(gè)字符最多占3個(gè)字節(jié),最大長(zhǎng)度不能超過(guò)21845.
若定義的時(shí)候超過(guò)上述限制,則varchar字段會(huì)被強(qiáng)行轉(zhuǎn)為text類(lèi)型,并產(chǎn)生warning.
c) 行長(zhǎng)度限制
導(dǎo)致實(shí)際應(yīng)用中varchar長(zhǎng)度限制的是一個(gè)行定義的長(zhǎng)度. MySQL要求一個(gè)行的定義長(zhǎng)度不能超過(guò)65535.若定義的表長(zhǎ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、計(jì)算例子 舉兩個(gè)例說(shuō)明一下實(shí)際長(zhǎng)度的計(jì)算.
a) 若一個(gè)表只有一個(gè)varchar類(lèi)型,如定義為 create table t4(c varchar(N)) charset=gbk;
則此處N的最大值為(65535-1-2)/2= 32766.
減1的原因是實(shí)際行存儲(chǔ)從第二個(gè)字節(jié)開(kāi)始';
減2的原因是varchar頭部的2個(gè)字節(jié)表示長(zhǎ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è)字節(jié);
減30*3的原因是char(30)占用90個(gè)字節(jié),編碼是utf8.
如果被 varchar 超過(guò)上述的 b 規(guī)則,被強(qiáng)轉(zhuǎn)成 text 類(lèi)型,則每個(gè)字段占用定義長(zhǎng)度為 11 字節(jié),當(dāng)然這已經(jīng)不是“ varchar ”了.
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/4054.html