gpt4 book ai didi

MySQL:查询 unicode 实体

转载 作者:可可西里 更新时间:2023-11-01 06:36:00 24 4
gpt4 key购买 nike

我需要从数据库中找到单词 Lämmönmyyntipalvelut。只是,在数据库中,它位于一个字段中,其值是一个 PHP 数组,使用 json_encode() 转换为 JSON,因此特殊字符被拼写为十六进制 unicode。

所以我的问题是

SELECT * FROM table WHERE (services LIKE '%Lämmönmyyntipalvelut%')

没有结果。没有惊喜。接下来,转换特殊字符查询:

SELECT * FROM table WHERE (services LIKE '%L\u00e4mm\u00f6nmyyntipalvelut%')

没有结果,我想知道为什么。接下来我测试了只查询特殊字符:

SELECT * FROM table WHERE (services LIKE '%\u00e4%')

找到了应该找到的东西。接下来我开始添加东西(L 到开头)以查看哪里出错了:

SELECT * FROM table WHERE (services LIKE '%L\u00e4%')

没有结果。另一个测试:

SELECT * FROM table WHERE (services LIKE '%\u00e4mm%')

找到了应该找到的东西。

所以我的结论是反斜杠在某种程度上把事情搞砸了,但我不明白这是怎么回事?

编辑:

services 字段的具体内容:

["Neuvonta","L\u00e4mm\u00f6nmyyntipalvelut",
"Mets\u00e4-\/energiapuunkorjuupalvelut"]

精确查询:

SELECT id, uid, company_name, services, logo FROM rekisteroeidy_toimijaks 
WHERE
(services LIKE '%L\u00e4mm\u00f6nmyyntipalvelut%' AND
services LIKE '%Mets\u00e4-\/energiapuunkorjuupalvelut%')
ORDER BY company_name ASC

我添加了一些换行符以提高可读性。

最佳答案

I have absolutely no idea why, but triple escaping helps!

好吧,这只是双重转义,但是它确实有效,原因如下:在 MySQL 中,当您使用 LIKE 运算符时,会涉及第二层转义。

services LIKE '%L\\\\u00e4mm\\\\u00f6n%'

解析 MySQL 字符串字面值可以让您与 LIKE 查询 %L\\u00e4mm\\u00f6n% 进行比较。因为 MySQL 将 LIKE 查询中的 \ 视为转义,所以它实际上匹配包含 L\u00e4mm\u00f6n 的文字字符串。

这样做的原因是您可以将字符串与包含文字 %_ 字符的查询表达式进行匹配。例如,如果我想在一列中搜索文字字符串 100%,我可以将其与 100\% 进行匹配(在查询中写为 '100\\%') 并确保我真的得到了 100% 而不是任何以 100 开头的字符串。

不幸的是,MySQL 在其 LIKE 查询转义和字符串文字转义中都使用反斜杠,特别是考虑到您可能正在使用也使用它们的封闭编程语言编写,最终以实际的三重编码结束,看起来像“服务像 '%L\\\\\\\\u00e4mm\\\\\\\u00f6n%'” - 啊!

非常不幸的是,这种行为不符合 ANSI SQL,并且在任何其他数据库中都不起作用。 ANSI SQL 表示默认情况下 LIKE 查询中没有转义字符,因此如果您想匹配文字 %_ 您必须通过指定转义字符来选择加入你自己的,例如:

something LIKE '100=%' ESCAPE '='

为了跨数据库兼容性,最好始终使用 LIKE...ESCAPE 形式,并选择可怕的反斜杠以外的其他内容! (另外 - MySQL 用于 SQL 字符串文字转义的反斜杠也不符合 ANSI!但是您可以使用 NO_BACKSLASH_ESCAPES sql_mode 设置关闭该错误行为。)

可能更好的主意是将 services 分解到第二个表中,而不是将它们压缩到单个字符串列中 - 即。把你的模式放在第一范式中。然后您可以获得单个值的简单查找,而不必执行缓慢的全表扫描子字符串匹配。

关于MySQL:查询 unicode 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com