MySQL UTF8 varchar列大小

5
根据MySQL的文档,自5.0版本以来,varchar长度是以字符单位计算而非字节。然而,最近我遇到一个问题,就是当我插入应该适合指定的varchar列的值时,会出现数据被截断的警告。
我用v5.1中的一个简单表格重现了这个问题。
mysql> show create table test\G
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE `test` (
  `string` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

接下来,我插入了多个长度为10个字符的值,这些值包含不同数量的UTF8字符。

mysql> insert into test (string) values 
    -> ('abcdefghij'),
    -> ('ãáéíçãáéíç'),
    -> ('ãáéíç67890'),
    -> ('éíç4567890'),
    -> ('íç34567890');
Query OK, 5 rows affected, 4 warnings (0.06 sec)
Records: 5  Duplicates: 0  Warnings: 4

mysql> show warnings;
+---------+------+---------------------------------------------+
| Level   | Code | Message                                     |
+---------+------+---------------------------------------------+
| Warning | 1265 | Data truncated for column 'string' at row 2 |
| Warning | 1265 | Data truncated for column 'string' at row 3 |
| Warning | 1265 | Data truncated for column 'string' at row 4 |
| Warning | 1265 | Data truncated for column 'string' at row 5 |
+---------+------+---------------------------------------------+

mysql> select * from test;
+------------+
| string     |
+------------+
| abcdefghij |
| ãáéíç |
| ãáéíç |
| éíç4567 |
| íç345678 |
+------------+
5 rows in set (0.00 sec)

我认为这表明 varchar 的大小仍然以字节定义,或者至少在字符单位上不准确。

问题是,我是否正确理解了文档,并且这是一个错误?还是我误解了文档?


1
虽然这对你没有任何帮助,但是在 sqlfiddle 上,它声称是 5.5.20 版本,却没有遇到这个问题。也许这是一个已经被修复的 bug(我已经搜索过了,但没有找到相关的 bug 报告)。 - eggyal
同样的问题存在于5.5.19中,所以可能是在那个版本中被修复了。发行说明检查并未提到varchar或UTF8。 - sreimer
1个回答

7

确实,VARCHAR和CHAR的大小是按字符而非字节计算的。

当我将连接字符集设置为latin1(单字节)时,我能够重现你的问题。

在运行插入查询之前,请使用以下命令将连接字符集设置为UTF8:

SET NAMES utf8

如果您不这样做,一个双字节的UTF8字符将被发送为两个单字节字符。您可能考虑更改默认客户端字符集

这确实是问题所在。如果使用了错误的字符集,我本来会预期结果记录显示不正确。 - sreimer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接