字符编码 - 关于 MySQL 的 varchar 长度计算的疑问
伊谢尔伦
伊谢尔伦 2017-04-17 11:56:39
0
7
694

先创建一个表

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\ |
+--------------------------+---------------------------------------------+
伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

répondre à tous(7)
刘奇

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

SELECT char_length('中文');

2

SELECT length('中文');

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

Ty80

在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以后就不是按字节来计算了

Peter_Zhu

Mysql varchar 数字计算方法 - 个数计算?2字节?3字节?4字节?编码格式决定一切啊!

Ty80

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)
在存储数据长度上不一样?
占用硬盘空间也不一样?

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!