日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

MySQL建表字段长度的限制、汉字和字母占字节数

發(fā)布時(shí)間:2025/3/12 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL建表字段长度的限制、汉字和字母占字节数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

varchar(N),N指的是最大字符數(shù),不是字節(jié)數(shù)。

記住:

(1)MySQL要求一個(gè)行的定義長(zhǎng)度不能超過(guò)65535。

(2)單個(gè)字段如果大于65535,則轉(zhuǎn)換為TEXT 。

(3)單行最大限制為65535,這里不包括TEXT、BLOB。

(4)utf8:
1character=3bytes, 1漢字=1character
也就是說(shuō)一個(gè)字段定義成 varchar(200),則它可以存儲(chǔ)200個(gè)漢字或者200個(gè)字母。
(5)gbk:
1character=2bytes,1漢字=1character
也就是說(shuō)一個(gè)字段定義成 varchar(200),則它可以存儲(chǔ)200個(gè)漢字或者200個(gè)字母。

在MySQL建表時(shí),遇到一個(gè)奇怪的現(xiàn)象:

root@localhost : test 10:30:54>CREATE TABLE tb_test (-> recordid varchar(32) NOT NULL,-> areaShow varchar(10000) DEFAULT NULL,-> areaShow1 varchar(10000) DEFAULT NULL,-> areaShow2 varchar(10000) DEFAULT NULL,-> PRIMARY KEY (recordid)-> ) ENGINE=INNODB DEFAULT CHARSET=utf8; 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 報(bào)錯(cuò)root@localhost : test 10:31:01>CREATE TABLE tb_test (-> recordid varchar(32) NOT NULL,-> areaShow varchar(30000) DEFAULT NULL,-> areaShow1 varchar(30000) DEFAULT NULL,-> areaShow2 varchar(30000) DEFAULT NULL,-> PRIMARY KEY (recordid)-> ) ENGINE=INNODB DEFAULT CHARSET=utf8; Query OK, 0 rows affected, 3 warnings (0.26 sec) 可以建立,只是類型被轉(zhuǎn)換了。root@localhost : test 10:31:14>show warnings; +-------+------+----------------------------------------------------+ | Level | Code | Message | +-------+------+----------------------------------------------------+ | Note | 1246 | Converting column 'areaShow' from VARCHAR to TEXT | | Note | 1246 | Converting column 'areaShow1' from VARCHAR to TEXT | | Note | 1246 | Converting column 'areaShow2' from VARCHAR to TEXT | +-------+------+----------------------------------------------------+ 3 rows in set (0.00 sec)

疑問(wèn):

為什么字段小(10000)的反而報(bào)錯(cuò),而大(30000)的則可以建立。為什么小的不能直接轉(zhuǎn)換呢?

解決:

原來(lái)MySQL在建表的時(shí)候有個(gè)限制:MySQL要求一個(gè)行的定義長(zhǎng)度不能超過(guò)65535。具體的原因可以看:

http://dev.mysql.com/doc/refman/5.1/en/silent-column-changes.html

(1)單個(gè)字段如果大于65535,則轉(zhuǎn)換為TEXT 。

(2)單行最大限制為65535,這里不包括TEXT、BLOB。

按照上面總結(jié)的限制,來(lái)解釋出現(xiàn)的現(xiàn)象:

第一個(gè)情況是:
單個(gè)字段長(zhǎng)度:varchar(10000) ,字節(jié)數(shù):10000*3(utf8)+(1 or 2) = 30000 ,小于65535,可以建立。
單行記錄長(zhǎng)度:varchar(10000)3,字節(jié)數(shù):300003(utf8)+(1 or 2) = 90000,大于65535,不能建立,所以報(bào)錯(cuò):

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

第二個(gè)情況是:
單個(gè)字段長(zhǎng)度:varchar(30000) ,字節(jié)數(shù):30000*3+(1 or 2) = 90000 , 大于65535,需要轉(zhuǎn)換成TEXT,才可以建立。所以報(bào)warnings。
單行記錄長(zhǎng)度:varchar(30000)*3,因?yàn)槊總€(gè)字段都被轉(zhuǎn)換成了TEXT,而TEXT沒有限制,所以可以建立表。

root@localhost : test 10:31:14>show warnings; +-------+------+----------------------------------------------------+ | Level | Code | Message | +-------+------+----------------------------------------------------+ | Note | 1246 | Converting column 'areaShow' from VARCHAR to TEXT | | Note | 1246 | Converting column 'areaShow1' from VARCHAR to TEXT | | Note | 1246 | Converting column 'areaShow2' from VARCHAR to TEXT | +-------+------+----------------------------------------------------+

用了這么久的MySQL,這個(gè)基本的建表限制都還不知道,慚愧啊。。

原因如下:

被問(wèn)到一個(gè)問(wèn)題:MySQL中varchar最大長(zhǎng)度是多少?這不是一個(gè)固定的數(shù)字。本文簡(jiǎn)要說(shuō)明一下限制規(guī)則。

1、限制規(guī)則

字段的限制在字段定義的時(shí)候有以下規(guī)則:

a) 存儲(chǔ)限制

? varchar 字段是將實(shí)際內(nèi)容單獨(dú)存儲(chǔ)在聚簇索引之外,內(nèi)容開頭用1到2個(gè)字節(jié)表示實(shí)際長(zhǎng)度(長(zhǎng)度超過(guò)255時(shí)需要2個(gè)字節(jié)),因此最大長(zhǎng)度不能超過(guò)65535。

b) 編碼長(zhǎng)度限制

? 字符類型若為gbk,每個(gè)字符最多占2個(gè)字節(jié),最大長(zhǎng)度不能超過(guò)32766;

? 字符類型若為utf8,每個(gè)字符最多占3個(gè)字節(jié),最大長(zhǎng)度不能超過(guò)21845。

? 若定義的時(shí)候超過(guò)上述限制,則varchar字段會(huì)被強(qiáng)行轉(zhuǎn)為text類型,并產(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類型,如定義為

? create table t4(c varchar(N)) charset=gbk;

? 則此處N的最大值為(65535-1-2)/2= 32766。

? 減1的原因是實(shí)際行存儲(chǔ)從第二個(gè)字節(jié)開始’;

? 減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類型的c占4個(gè)字節(jié);

? 減30*3的原因是char(30)占用90個(gè)字節(jié),編碼是utf8。

如果被varchar超過(guò)上述的b規(guī)則,被強(qiáng)轉(zhuǎn)成text類型,則每個(gè)字段占用定義長(zhǎng)度為11字節(jié),當(dāng)然這已經(jīng)不是“varchar”了。

?

總結(jié)

以上是生活随笔為你收集整理的MySQL建表字段长度的限制、汉字和字母占字节数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。