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大小仍以字节或至少为单位定义,在字符单元中不准确.
问题是,我是否正确理解文档并且这是一个错误?还是我误解了文档?
确实,VARCHAR和CHAR大小是以字符而不是字节来考虑的.
当我将连接字符集设置为latin1(单字节)时,我能够重新创建您的问题.
确保在使用以下命令运行插入查询之前将连接字符集设置为UTF8:
SET NAMES utf8
Run Code Online (Sandbox Code Playgroud)
如果不这样做,两个字节的UTF8字符将作为两个单字节字符发送.
您可以考虑更改默认客户端字符集.
| 归档时间: |
|
| 查看次数: |
5459 次 |
| 最近记录: |