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

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

我正在try 向id记录插入二进制值.

如果我做SELECT UUID_TO_BIN('7be7daf5-73ef-4f73-a784-46ea44403293',1);,它就会显示出Ossú,"FèD@2".

现在,如果我try 将该输出插入到这个查询INSERT INTO uuid VALUES ('Ossï{çÚõ§„FêD@2“');中,则得到SQL Error (1406): Data too long for column 'id' at row 1.

这个问题可能看起来很复杂,但这就是我从后端接收二进制数据的方式,我在这里try 进行故障排除.有没有人能帮我解释为什么会出现这个错误?

谢谢.

推荐答案

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

例如,请看前五个字符,"Ossí{"

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

字节EF是ai的Latin1 encoding,因此与该字节最接近的可打印字符输出为aid.

但是,然后您复制和粘贴字符串,它将被转换为UTF-8编码,其中YI具有多字节序列.

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

您可以看到aii在UTF-8中被编码为C3AF(两个字节),后跟{AS 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相关问答推荐

MySQL没有使用S隐式附加到此二级索引的主键

根据计数按月和年对数据进行分组()

MySQL工作台的编码问题

避免多个SQL查询的重构代码

为什么我的 SQL 查询不更新 Node.js 和 MySQL 中用户以外的用户属性?

global max_connections 和 spring.hikari.maximumPoolSize 有什么区别?

基于其列之一内的值查询模型

高效的 SQL 查询,用于计算半小时时间序列中已发生的行的一部分

计算MySQL中的连续出现

什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?

如何使主键从 1000 开始?

MySQL如何为数据库中的所有表生成DDL

MySQL Workbench 无法加载 mysql.proc

WHERE 子句中的条件顺序会影响 MySQL 性能吗?

如何将 mysqldump 的输出拆分为较小的文件?

"SELECT COUNT(*)" 很慢,即使有 where 子句

与 MySql 的连接正在自动中止.如何正确配置Connector/J?

MySQL - 重复表

MySQL合并两列并添加到一个新列中

MySQL CREATE TABLE 语句中的 PRIMARY KEY 定义