MySQL:以UUID(字节串)作为主键的查询不起作用



我在MySQL数据库中有一个表,它使用UUID v1作为主键。UUID存储为优化的16字节字符串,如中所述https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/。该列的MYSQL数据类型为二进制(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行查询选择*自my_table其中id=‘AäAÉü³(

知道发生了什么吗?

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

或者。。。而不是说

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

捕获十六进制并说

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

也就是说,将$byte_string设为32位十六进制数字。

解决SQL注入问题还可以解决二进制格式的某些字符在PHP插值字符串中无法很好地展开的问题。

使用PDO或mysqli解决方案可以解决这两个问题。

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

最新更新