MySQL:使用UUID(字节字符串)作为主键的查询无法正常工作

时间:2018-11-12 19:51:11

标签: mysql wordpress innodb uuid

我在MySQL数据库中有一个表,该表使用UUID v1作为主键。 如https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/中所述,UUID被优化存储为16字节字符串。 该列的MYSQL数据类型为binary(16)。使用PHP库以相同的方式生成所有UUID。 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'附近使用正确的语法进行查询                                   选择 *                                   来自my_table                                   WHERE id ='èäAÈü³(

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

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

MySQL-5.0.12到目前为止还没有处于任何维护状态。唯一的解决方案是升级,您会遇到麻烦。越快越好。

答案 1 :(得分:0)

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

或者...不用说

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

捕获十六进制并说

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

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