我在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Èü³(
有什么想法吗?
答案 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个十六进制数字。