MySQL:使用 UUID(bytestring)作为主键的查询不起作用

MySQL: Query with UUID (bytestring) as primary key not working

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

我像这样从 table 中检索行:

$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 database error You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '?IÄžo' at line 3 for query SELECT * FROM my_table WHERE id = 'èäAÈü³(

知道发生了什么事吗?

解决您的 SQL 注入问题也将解决某些二进制格式的字符在 PHP 内插字符串中不能很好地扩展的问题。

使用 PDO or mysqli 解决方案将解决您的两个问题。

还有 MySQL-5.0.12,它目前处于任何维护状态之外。您将 运行 陷入麻烦,唯一的解决办法就是升级。越快越好

27是单引号,22是双引号。因此非常需要转义二进制字符串。是的,那个 link 告诉你如何只用 16 个字节来存储它。

或者...而不是说

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

捕获十六进制并说

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

也就是说,$byte_string 是 32 个十六进制数字。