关于 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\ |
+--------------------------+---------------------------------------------+
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
mysql varchar 类型的长度指的是字符个数,而不是字节数, 和编码无关。
2
6
(utf8 编码下每个中文字符占用 3 个字节)在mysql中varchar(3)并不代表长度为3个字节,而是代表3个字符,对于varchar(3)来说“我不是”和“abc”是一样的长度~
不是DBA,简单看了下MySQL的文档,应该是MySQL在CHARSET是utf8是,存储数据不是直接的按byte算的,对于西欧字符、中文字符之类的用的是multibyte charcter,可以认为它存的是字而不是位。
参考:
http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8.html
http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html
mysql 5.5以后就不是按字节来计算了
Mysql varchar 数字计算方法 - 个数计算?2字节?3字节?4字节?编码格式决定一切啊!
UTF-8,先要理解是什么格式,变长字符集,用2-3个字节来表示一个字符。
所以只能以字符的方式来统计字数,全角与半角都当作一个字符看待。
但是有个情况要小心VARCHAR的极限长度问题,就是字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766; 字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。 若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning
一直对mysql的字段长度不明白;
varchar(1)
varchar(20)
char(20)
int(1)
int(20)
在存储数据长度上不一样?
占用硬盘空间也不一样?