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

发布于 2022-08-31 21:02:33 字数 1400 浏览 14 评论 0

先创建一个表

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

套路撩心 2022-09-07 21:02:33

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

SELECT char_length('中文');

2

SELECT length('中文');

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

じее 2022-09-07 21:02:33

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

梦忆晨望 2022-09-07 21:02:33

不是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

秋心╮凉 2022-09-07 21:02:33

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

残月升风 2022-09-07 21:02:33

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

忆梦 2022-09-07 21:02:33

一直对mysql的字段长度不明白;
varchar(1)
varchar(20)
char(20)
int(1)
int(20)
在存储数据长度上不一样?
占用硬盘空间也不一样?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文