gpt4 book ai didi

mysql - 插入二进制数据导致 "Data too long for column..."

转载 作者:行者123 更新时间:2023-12-05 03:19:42 24 4
gpt4 key购买 nike

我有一个使用以下代码创建的 MySQL 表:

CREATE TABLE `uuid` (
`id` BINARY(16) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
)
COLLATE='utf8mb4_unicode_ci'
ENGINE=InnoDB
;

我正在尝试向 id 记录中插入一个二进制值。

如果我执行 SELECT UUID_TO_BIN('7be7daf5-73ef-4f73-a784-46ea44403293',1); 它会显示 Ossï{çÚõ§„FêD@2“

现在,如果我尝试使用此查询插入该输出 INSERT INTO uuid VALUES ('Ossï{çÚõ§„FêD@2“'); 我会收到 SQL 错误 (1406):第 1 行“id”列的数据太长

这个问题可能看起来很连线,但这就是我从后端接收二进制数据的方式,我正试图在这里进行故障排除。请帮助我为什么会收到该错误?

谢谢。

最佳答案

长度差异的原因是二进制输出产生的一些奇怪字符被编码为 UTF-8 字符,每个字符占用超过一个字节。

例如,看前五个字符“Ossï{”

mysql> select hex(UUID_TO_BIN('7be7daf5-73ef-4f73-a784-46ea44403293',1)) as hex;
+----------------------------------+
| hex |
+----------------------------------+
| 4F7373EF7BE7DAF5A78446EA44403293 |
+----------------------------------+
O s s ï {

字节 EF 是 Latin1 encoding对于 ï,所以最接近该字节的可打印字符输出为 ï。

但是随后您复制并粘贴该字符串,它会转换为 UTF-8 编码,其中 ï 具有多字节序列。

mysql> select hex('Ossï{çÚõ§„FêD@2“') as hex;
+------------------------------------------------------+
| hex |
+------------------------------------------------------+
| 4F7373C3AF7BC3A7C39AC3B5C2A7E2809E46C3AA444032E2809C |
+------------------------------------------------------+
O s s ï {

您可以看到 ï 在 UTF-8 中被编码为 C3AF(两个字节),后跟 { 为 7B。

这个字符串中还有其他几个多字节字符;我只提请注意第一个。

当您复制和粘贴带有有趣的非 ASCII 字符的字符串时,它不是二进制字节,而是 UTF-8 字符的字符串,其中一些是多字节的。

如果你避免复制和粘贴字符串,你可以获得预期的二进制字节长度:

mysql> SELECT LENGTH(UUID_TO_BIN('7be7daf5-73ef-4f73-a784-46ea44403293',1)) as len;
+------+
| len |
+------+
| 16 |
+------+

所以当你插入你的表时使用它:

mysql> insert into uuid set id = 'Ossï{çÚõ§„FêD@2“';
ERROR 1406 (22001): Data too long for column 'id' at row 1

mysql> insert into uuid set id = UUID_TO_BIN('7be7daf5-73ef-4f73-a784-46ea44403293',1);
Query OK, 1 row affected (0.00 sec)

关于mysql - 插入二进制数据导致 "Data too long for column...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73391309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com