MySQL:查询unicode实体

Sim*_*Kok 7 mysql unicode

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

所以我的查询是

SELECT * FROM table WHERE (services LIKE '%Lämmönmyyntipalvelut%')
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM table WHERE (services LIKE '%L\u00e4mm\u00f6nmyyntipalvelut%')
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM table WHERE (services LIKE '%\u00e4%')
Run Code Online (Sandbox Code Playgroud)

找到了应该找到的东西.接下来我开始添加东西(L到开头)以查看它出错的地方:

SELECT * FROM table WHERE (services LIKE '%L\u00e4%')
Run Code Online (Sandbox Code Playgroud)

没有结果.另一个测试:

SELECT * FROM table WHERE (services LIKE '%\u00e4mm%')
Run Code Online (Sandbox Code Playgroud)

找到了应该找到的东西.

所以我的结论是反斜杠在某种程度上弄乱了,但我不明白怎么回事?

编辑:

服务领域的确切内容:

["Neuvonta","L\u00e4mm\u00f6nmyyntipalvelut",
"Mets\u00e4-\/energiapuunkorjuupalvelut"]
Run Code Online (Sandbox Code Playgroud)

确切的查询:

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
Run Code Online (Sandbox Code Playgroud)

我添加了一些换行符以帮助提高可读性.

bob*_*nce 8

我完全不知道为什么,但三重逃避有帮助!

嗯,这只是双重逃避,但是它是有效的,这就是原因:在MySQL中,当你使用LIKE运算符时,会涉及第二层转义.

services LIKE '%L\\\\u00e4mm\\\\u00f6n%'
Run Code Online (Sandbox Code Playgroud)

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

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

这是不幸的是,MySQL使用反斜杠为它的LIKE查询逃逸,其字符串字面转义,特别是考虑到你可能在同时使用它们,用编码三重实际的,它看起来像结束了一个封闭的编程语言编写"services LIKE '%L\\\\\\\\u00e4mm\\\\\\\\u00f6n%'"-哎呀!

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

something LIKE '100=%' ESCAPE '='
Run Code Online (Sandbox Code Playgroud)

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

可能更好的想法是打破services第二个表而不是将它们压缩成单个字符串列 - 即.将您的架构放在First Normal Form中.然后,您可以简单地查找单个值,而不必进行慢速全表扫描子字符串匹配.