关于 MySQL 的 varchar 长度计算的疑问

先创建一个表

CREATE TABLE `test` (
  `a` varchar(3) NOT NULL DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

字段a类型为varchar,长度3为三个字节,也就是说字段a里面最多可以存三个字节长度的数据。
但是我只想下面的sql语句竟然能成功。SQL语句为:

insert into test values ('汉ab');

“汉”unicode的字节长度为3,'ab'两个字符的字节长度为2,总共有的字节长度为5了,为什么能插入成功呢,我的sql_mode设置的为严格模式。

MySQL编码信息为:

> mysql> show variables like "%char%";                            
+--------------------------+---------------------------------------------+
| Variable_name            | Value                                       |
+--------------------------+---------------------------------------------+
| character_set_client     | utf8                                        |
| character_set_connection | utf8                                        |
| character_set_database   | latin1                                      |
| character_set_filesystem | binary                                      |
| character_set_results    | utf8                                        |
| character_set_server     | latin1                                      |
| character_set_system     | utf8                                        |
| character_sets_dir       | D:\lamp\mysql-5.6.23-winx64\share\charsets\ |
+--------------------------+---------------------------------------------+
阅读 10.2k
7 个回答

mysql varchar 类型的长度指的是字符个数,而不是字节数, 和编码无关。

SELECT char_length('中文');

2

SELECT length('中文');

6 (utf8 编码下每个中文字符占用 3 个字节)

在mysql中varchar(3)并不代表长度为3个字节,而是代表3个字符,对于varchar(3)来说“我不是”和“abc”是一样的长度~

新手上路,请多包涵

mysql 5.5以后就不是按字节来计算了

UTF-8,先要理解是什么格式,变长字符集,用2-3个字节来表示一个字符。
所以只能以字符的方式来统计字数,全角与半角都当作一个字符看待。
但是有个情况要小心VARCHAR的极限长度问题,就是字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。 若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏