根据MySQL的文档,自5.0版本以来,varchar长度是以字符单位计算而非字节。然而,最近我遇到一个问题,就是当我插入应该适合指定的varchar列的值时,会出现数据被截断的警告。
我用v5.1中的一个简单表格重现了这个问题。
我用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 的大小仍然以字节定义,或者至少在字符单位上不准确。
问题是,我是否正确理解了文档,并且这是一个错误?还是我误解了文档?