首页 > 解决方案 > MySQL:使用 UUID(字节串)作为主键的查询不起作用

问题描述

我在 MySQL 数据库中有一个表,它使用 UUID v1 作为主键。UUID 存储为优化的 16 字节字符串,如https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/中所述。该列的 MYSQL 数据类型是 binary(16)。所有 UUID 都使用 PHP 库以相同的方式生成。MySQL 是 v5.0.12。

我像这样从表中检索行:

$where = sprintf("'%s'", $bytestring_uuid);

$wpdb->get_results(
                            "
                                SELECT *
                                FROM $my_table
                                WHERE id = $where 
                            "
            );

现在这通常有效,但奇怪的是,对于某些 UUID,查询会失败,我不知道为什么。

以下是查询使用的一些 UUID(以原始格式,因此您可以阅读它们):

c80615fc-e441-11e8-b328-002522a6b241

d4c94f0c-e441-11e8-9316-002522a6b241

df11cade-e441-11e8-b3a5-002522a6b241

这个失败了:

27c049c4-e67f-11e8-9e6f-002522a6b241

错误日志:

WordPress 数据库错误 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 3 行的“?IÄžo”附近使用正确的语法进行查询 SELECT * FROM my_table WHERE id = 'èäAÈü³(

任何想法发生了什么?

标签: mysqlwordpressinnodbuuid

解决方案


27 是单引号,22 是双引号。因此,非常需要转义二进制字符串。是的,该链接告诉您如何仅使用 16 个字节来存储它。

或者...而不是说

WHERE uuid = '?IÄžo...'

捕获十六进制并说

WHERE uuid = UNHEX('27c049c4e67f11...');

也就是说,有$byte_string32 个十六进制数字。


推荐阅读