我试图找出与数据截断有关的一些警告消息之间的区别。考虑下表:

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。

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top