MySQL UTF8 varchar列大小

sre*_*mer 5 mysql varchar utf-8

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)
Run Code Online (Sandbox Code Playgroud)

然后我插入了多个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)
Run Code Online (Sandbox Code Playgroud)

我认为这表明varchar大小仍以字节或至少为单位定义,在字符单元中不准确.

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

Mar*_*ams 7

确实,VARCHAR和CHAR大小是以字符而不是字节来考虑的.

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

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

SET NAMES utf8
Run Code Online (Sandbox Code Playgroud)

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

您可以考虑更改默认客户端字符集.