日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

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

記住:

(1)MySQL要求一個行的定義長度不能超過65535。

(2)單個字段如果大于65535,則轉換為TEXT 。

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

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

在MySQL建表時,遇到一個奇怪的現象:

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 報錯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) 可以建立,只是類型被轉換了。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)

疑問:

為什么字段小(10000)的反而報錯,而大(30000)的則可以建立。為什么小的不能直接轉換呢?

解決:

原來MySQL在建表的時候有個限制:MySQL要求一個行的定義長度不能超過65535。具體的原因可以看:

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

(1)單個字段如果大于65535,則轉換為TEXT 。

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

按照上面總結的限制,來解釋出現的現象:

第一個情況是:
單個字段長度:varchar(10000) ,字節數:10000*3(utf8)+(1 or 2) = 30000 ,小于65535,可以建立。
單行記錄長度:varchar(10000)3,字節數:300003(utf8)+(1 or 2) = 90000,大于65535,不能建立,所以報錯:

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

第二個情況是:
單個字段長度:varchar(30000) ,字節數:30000*3+(1 or 2) = 90000 , 大于65535,需要轉換成TEXT,才可以建立。所以報warnings。
單行記錄長度:varchar(30000)*3,因為每個字段都被轉換成了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,這個基本的建表限制都還不知道,慚愧啊。。

原因如下:

被問到一個問題:MySQL中varchar最大長度是多少?這不是一個固定的數字。本文簡要說明一下限制規則。

1、限制規則

字段的限制在字段定義的時候有以下規則:

a) 存儲限制

? varchar 字段是將實際內容單獨存儲在聚簇索引之外,內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節),因此最大長度不能超過65535。

b) 編碼長度限制

? 字符類型若為gbk,每個字符最多占2個字節,最大長度不能超過32766;

? 字符類型若為utf8,每個字符最多占3個字節,最大長度不能超過21845。

? 若定義的時候超過上述限制,則varchar字段會被強行轉為text類型,并產生warning。

c) 行長度限制

? 導致實際應用中varchar長度限制的是一個行定義的長度。 MySQL要求一個行的定義長度不能超過65535。若定義的表長度超過這個值,則提示

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、計算例子

舉兩個例說明一下實際長度的計算。

a)若一個表只有一個varchar類型,如定義為

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

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

? 減1的原因是實際行存儲從第二個字節開始’;

? 減2的原因是varchar頭部的2個字節表示長度;

? 除2的原因是字符編碼是gbk。

b) 若一個表定義為

? 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個字節;

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

如果被varchar超過上述的b規則,被強轉成text類型,則每個字段占用定義長度為11字節,當然這已經不是“varchar”了。

?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩伦理一区二区三区 | 欧美在线看片 | 欧美视频1区 | jjzzjjzz欧美69巨大 | 久久免费一级片 | 午夜理伦三级理论 | 丁香婷婷社区 | 狠狠艹av| 有码一区二区三区 | www.国产麻豆 | 国产精品人人 | 天天干夜夜看 | 美女热逼 | 打屁股疼的撕心裂肺的视频 | 青娱乐99| 91视频爱爱| 久久123| 肥老熟妇伦子伦456视频 | 黄色国产一级片 | 古装三级吃奶做爰 | 激情五月五月婷婷 | 夜夜夜夜操 | 杨幂国产精品一区二区 | 91精品一区二区三区在线观看 | 久久精品亚洲无码 | 亚洲久爱 | 五月天色婷婷综合 | 青青草国产一区 | 免费欧美一级片 | 日韩伊人 | 天天狠狠| 国产精品一区二区精品 | 亚洲综合中文 | 午夜三级影院 | 日韩高清在线播放 | 国产资源在线观看 | 91精品国产综合久久久久久久 | 岛国av免费 | 涩天堂| 人人射人人射 | 日韩伦理av| 亚洲影库| 日韩一区二区三区精品 | 天天干天天干 | 久久噜噜噜精品国产亚洲综合 | 国产欧美日韩综合精品一区 | 国产又粗又猛又爽又黄 | 日韩一级久久 | 蜜桃在线一区二区三区 | 暗呦丨小u女国产精品 | 亚洲视频一区在线播放 | 亚洲黄色小说图片 | 久久亚洲成人 | 激情福利在线 | 夜夜爱视频 | 伊人www | 中文字幕精品一区二区精品 | 国产亚洲欧美在线 | 四虎8848| 国产aⅴ无码片毛片一级一区2 | 美国三级视频 | 三年大全国语中文版免费播放 | 在线观看av中文字幕 | 日韩av网站在线观看 | 欧美高清一级 | 国产麻豆91| 丝袜+亚洲+另类+欧美+变态 | xxxx国产视频 | 夜夜爽夜夜 | 欧美黄页| 国产乱码精品一区二区三区亚洲人 | 免费精品无码AV片在线观看黄 | 色.com | 都市激情中文字幕 | 久久精品一区二区三区不卡牛牛 | 136福利视频导航 | 国产日韩在线观看一区 | 亚洲国产第一 | 日产av在线播放 | 久久视频一区二区 | 亚洲女人的天堂 | 在线观看av的网站 | 飘花影院伦理片 | 免费av网址在线 | 日本少妇喷水 | 国产伦精品免费视频 | 亚洲精品久久久蜜桃 | 午夜国产小视频 | 在线国产不卡 | 色老大影院 | 国产激情视频网站 | 欧美 国产 综合 | av中文字幕一区二区三区 | 久久国产精品国语对白 | 美日韩黄色片 | 午夜视频欧美 | 欧美aa大片| 欧美色图在线观看 | 最新最近中文字幕 |