题
我试图找出与数据截断有关的一些警告消息之间的区别。考虑下表:
CREATE TABLE `txttest` (
`mycol` text NOT NULL )
ENGINE=InnoDB DEFAULT CHARSET=utf8;
几乎预期的行为:
mysql > insert into txttest (mycol) values (repeat('a',65535));
Query OK, 1 row affected (0.17 sec)
mysql > insert into txttest (mycol) values (repeat('a',65536));
Query OK, 1 row affected, 1 warning (0.16 sec)
mysql > show warnings;
+---------+------+--------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------+
| Warning | 1265 | Data truncated for column 'mycol' at row 1 |
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)
但是,当我使用多字节字符时,会发生预期的警告状态,但消息是不同的:
mysql > insert into txttest (mycol) values (repeat('é',65536/2-1));
Query OK, 1 row affected (0.17 sec)
mysql > insert into txttest (mycol) values (repeat('é',65536/2));
Query OK, 1 row affected, 1 warning (0.16 sec)
mysql > show warnings;
+---------+------+----------------------------------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xC3\xA9' for column 'mycol' at row 1 |
+---------+------+----------------------------------------------------------------+
1 row in set (0.00 sec)
Google尝试并不是很有用,因为我主要是在此消息的粘贴上奔跑,以在不同的上下文中进行。
基本上,我想知道的是:这仅仅是简单的措辞/错误代码mysql在截断一系列多键字符时使用的,还是有些东西告诉我应该从此消息中汲取灵感?
我最初认为这意味着字节序列在如此之多的地方被拆分,这导致了畸形的字符。试图尝试做到这一点的尝试不起作用(例如,MySQL识别编码角色的合适字节边界似乎很好)。
编辑:
重新审视后,看起来确实是我最初被解雇的炭分裂。我最初是一个大脑放屁的地方。
解决方案
这是将2字节字符串存储到一个字节中的尝试
由于最大文本长度为65535,因此可以安全地持有32767(65536/2-1)2字节字符,而没有错误消息。
任何添加32768 2字节字符的尝试都将导致 Incorrect string value: '\xC3\xA9' for column 'mycol' at row 1
因为第32768个角色没有房间可以插入mycol。
事实上, 你没有畸形的角色. 。您确实可以一个文本字段,其2字节字符数量和长度为32767。最后一个字符只是丢失而不考虑的。
为了确保运行这个
select length(mycol) from txttest;
最后一个插入不会为65536乘65534。
不隶属于 dba.stackexchange