今天有一个疑问,同样是 varchar(2),可以存放 “ab”,也可以存放“中国”,但是ab和中国所对应的字节数是不同的。
因此做了以下实验:
select length(str) from table;
结果是:
结论:对于MySQL,varchar(2)的意思就是2个字符,可以是2个英文,也可以是2个汉字,但是实际占用,还是英文占用1个字节,汉字占用3个字节。
注意:
emoji表情也是Unicode编码,但是占用4个字节,所以MySQL默认的utf8放不下,需要使用utf8mb4才可以
MySql 5.0 以上的版本:
1、一个汉字占多少长度与编码有关:
UTF-8:一个汉字 = 3个字节,英文是一个字节
GBK: 一个汉字 = 2个字节,英文是一个字节
2、varchar(n) 表示n个字符,无论汉字和英文,MySql都能存入 n 个字符,仅实际字节长度有所区别。
所以,varchar究竟可以存储多少字符呢:
mysql的记录行长度是有限制的,不是无限长的,这个长度是64K,即65535个字节,对所有的表都是一样的。
MySQL对于变长类型的字段会有1-2个字节来保存字符长度。
在utf-8状态下的varchar,最大只能到 (65535 - 2) / 3 = 21844 余 1。
在gbk状态下的varchar, 最大只能到 (65535 - 2) / 2 = 32766 余 1