2012-05-01 49 views
5

MySQL文档说,自5.0起,varchar长度引用字符单位,而不是字节。但是,最近我遇到了一个问题,那就是在插入适合指定的varchar列的值时,我正在截取数据警告。MySQL UTF8 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]上(http://sqlfiddle.com/#!2/829b8/2),声称它是5.5.20,不会遇到这个问题。也许这是一个已经修复的错误(我已经搜索过,但没有找到错误报告)。 – eggyal

+0

5.5.19中存在相同的问题,因此可能是其修复的版本。发行说明的检查显示没有提及varchars或UTF8 – sreimer

回答

7

的确,VARCHAR和CHAR大小被认为是字符而不是字节。

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

确保您设置连接字符集设置为UTF-8与运行以下命令插入查询之前:

SET NAMES utf8 

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

你可能会考虑改变你的default client character set

+0

这确实是问题所在。如果使用不正确的字符集,我会期望得到的记录显示不正确。 – sreimer