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 个十六进制数字。
我在 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 个十六进制数字。