MySQL UTF8 varchar列大小

时间:2012-05-01 17:34:03

标签: mysql utf-8 varchar

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)

然后我插入了多个具有不同UTF8字符数量的10个字符值

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 个答案:

答案 0 :(得分:7)

确定VARCHAR和CHAR大小用字符表示,而不是字节。

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

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

SET NAMES utf8

如果你不这样做,一个双字节的UTF8字符将作为两个单字节字符发送。

您可以考虑更改default client character set