mysql - MySQL:使用 UUID(字节串)作为主键的查询不起作用
问题描述
我在 MySQL 数据库中有一个表,它使用 UUID v1 作为主键。UUID 存储为优化的 16 字节字符串,如https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/中所述。该列的 MYSQL 数据类型是 binary(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 行的“?IÄžo”附近使用正确的语法进行查询 SELECT * FROM my_table WHERE id = 'èäAÈü³(
任何想法发生了什么?
解决方案
27 是单引号,22 是双引号。因此,非常需要转义二进制字符串。是的,该链接告诉您如何仅使用 16 个字节来存储它。
或者...而不是说
WHERE uuid = '?IÄžo...'
捕获十六进制并说
WHERE uuid = UNHEX('27c049c4e67f11...');
也就是说,有$byte_string
32 个十六进制数字。
推荐阅读
- python - 如何使用逗号分隔的字符串制作列表?
- macos - 尽管在 conda 3.8 环境中运行 Python 版本 2.7
- c# - 有没有比使用 Contains 方法更快的方法来搜索大型集合中是否存在实例?
- django - Django - 如何在 if 语句中终止 content_type?
- git - “.gitignore”的问题
- c# - C# 表单大小不匹配
- html - D3_Redraw chart with filter
- python - Python 对象的深度复制是否会复制其静态变量?
- java - 为什么 Kernel32 OpenProcess 函数返回 null?
- xaml - 使用 Style 属性设置条目行为