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大小仍以字节为单位或至少以字符为单位不准确。
问题是,我是否正确理解文档并且这是一个错误?或者我误解了文档?
答案 0 :(得分:7)
确定VARCHAR和CHAR大小用字符表示,而不是字节。
当我将连接字符集设置为latin1(单字节)时,我能够重新创建您的问题。
确保在使用以下命令运行插入查询之前将连接字符集设置为UTF8:
SET NAMES utf8
如果你不这样做,一个双字节的UTF8字符将作为两个单字节字符发送。
您可以考虑更改default client character set。