如果你在test2表裡把varchar(21842)改為varchar(21844),那麼就會報以下錯誤:
1118 - Row size too large.
The maximum row size for the used table type, not counting BLOBs, is 65535.
This includes storage overhead, check the manual.
You have to change some columns to TEXT or BLOBs.
可見,varchar(5)能儲存5個字元,不管是數字,字母,還是漢字.
該表中varchar類型的字段能容納的最大字元數21842是怎麼得來的?
21842 = (65535-1-2-4)/3
MySQL要求一個行的定義長度不能超過65535(包含多個欄位),所以有65535.
varchar的最大有效長度取決於最大行大小.
減1的原因是實際行的儲存從第2個位元組開始.
減2的原因是varchar頭部的2個位元組表示長度.
減4的原因是字段id的int型別佔用4個位元組.
除以3的原因是一個utf8字元佔用3個位元組.
如果你在test2表裡把varchar(21842)改為varchar(21844),那麼就會報以下錯誤:
1118 - Row size too large.
The maximum row size for the used table type, not counting BLOBs, is 65535.
This includes storage overhead, check the manual.
You have to change some columns to TEXT or BLOBs.
MySQL中char,varchar與text類型的選用:
知道固定長度的用char,例如MD5串固定是32位.
經常變化的欄位用varchar.
超過255字符的只能用varchar或text,不能用char.
能用varchar的地方不用text.
MySQL 的字元大小和字元集有關,如果字元集是 ascii,則保存不了中文(會顯示成亂碼),如果是 UTF8,每個字元是1-3個位元組。
用事實說話
先檢查資料庫字元集
結果:UTF8
建立表格(注意:
varchar(10)
)插入資料
十字ASCII字符,正確執行
十個中文字符,正確執行
但是十一個ASCII或中文都是報錯,說資料太長。
結論
長度是目前字元集的字元長度,而不是位元組長度!
varchar(6000)是可以儲存6000個字節,如果字元集採用UTF-8的話,由於UTF-8是一種“可變長編碼”,英文字母被編成一個字節,漢字通常是3個字節,只有極其生僻的字才會被編碼成4-6個位元組。因此可認為編碼是UTF-8時varchar(6000)裡可以儲存2000個漢字
varchar和char的長度並不是指字節長度,而是當前字符集下,最多多少個字符,比如,varchar 100,存ascii字符,最多存儲100個,存中文也是最多存100個,而不是33個。