mysql:以uuid(bytestring)作为主键的查询不起作用

7fhtutme  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(413)

我在mysql数据库中有一个表,它使用uuidv1作为主键。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服务器版本相对应的手册,以获得在“?i”附近使用的正确语法äž在查询的第3行选择“从我的表中选择*,其中id=”èä一èü³(
知道发生了什么吗?

toe95027

toe950271#

解决sql注入问题还可以解决一些二进制格式的字符在php内插字符串中无法很好地扩展的问题。
使用pdo或mysqli解决方案可以解决这两个问题。
同样是mysql-5.0.12,目前还没有任何维护状态。你会遇到麻烦,唯一的解决办法就是升级。越快越好。

waxmsbnn

waxmsbnn2#

27是单引号,22是双引号。因此非常需要转义二进制字符串。是的,该链接告诉您如何仅使用16个字节来存储它。
或者。。。而不是说

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

抓住魔咒说

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

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

相关问题