Maison  >  Questions et réponses  >  le corps du texte

字符编码 - 关于 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\ |
+--------------------------+---------------------------------------------+
伊谢尔伦伊谢尔伦2743 Il y a quelques jours677

répondre à tous(7)je répondrai

  • 怪我咯

    怪我咯2017-04-17 11:58:39

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

    SELECT char_length('中文');
    

    2

    SELECT length('中文');
    

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

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 11:58:39

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

    répondre
    0
  • 阿神

    阿神2017-04-17 11:58:39

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

    répondre
    0
  • ringa_lee

    ringa_lee2017-04-17 11:58:39

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

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-17 11:58:39

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

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 11:58:39

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

    répondre
    0
  • PHP中文网

    PHP中文网2017-04-17 11:58:39

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

    répondre
    0
  • Annulerrépondre