如果你在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个。