当前位置: 首页 > 面试题库 >

MySQL:查询unicode实体

任昊阳
2023-03-14
问题内容

我需要从数据库中找到单词 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%')

找到了应该找到的东西。

因此,我的结论是反斜杠某种程度上使事情搞砸了,但我不知道怎么做?

编辑:

服务领域的确切内容:

["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

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


问题答案:

我绝对不知道为什么,但是三重转义会有所帮助!

好吧,这只是双重转义,但是是可行的,原因如下:在MySQL中,使用LIKE运算符时涉及第二层转义。

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

解析该MySQL字符串文字可以使您与LIKE-query进行比较%L\\u00e4mm\\u00f6n%。由于MySQL
\在LIKE查询中将其视为转义符,因此实际上将匹配包含的文字字符串L\u00e4mm\u00f6n

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

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

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

something LIKE '100=%' ESCAPE '='

为了实现跨数据库兼容性,最好始终使用LIKEESCAPE表单,并选择除可怕的反斜杠之外的其他东西!(此外-
MySQL的SQL字符串文字转义的反斜杠也不符合ANSI!但是您可以使用NO_BACKSLASH_ESCAPES sql_mode设置来消除这种不当行为。)

可能更好的主意是将其分解services为第二个表,而不是将它们压缩为单个字符串列-即。将您的架构放入第一范式。然后,您可以简单地查找各个值,而不必执行慢的全表扫描子字符串匹配。



 类似资料:
  • 问题内容: 我如何跟踪Linux服务器上发生的MySQL查询? 例如,我希望设置某种侦听器,然后请求一个网页并查看引擎执行的所有查询,或者仅查看在生产服务器上运行的所有查询。我怎样才能做到这一点? 问题答案: 您可以运行MySQL命令以查看在任何给定时间正在处理哪些查询,但这可能无法实现您所希望的。 获取历史记录而不必使用服务器修改每个应用程序的最佳方法可能是通过触发器。您可以设置触发器,以便每次

  • 本文向大家介绍查询将MySQL LIKE实现为MySQL IN?,包括了查询将MySQL LIKE实现为MySQL IN?的使用技巧和注意事项,需要的朋友参考一下 要实现类似MySQL IN()的查询,您需要使用COUNT(),IF()以及LIKE运算符。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 这是将LIKE实现为IN

  • 本文向大家介绍MySQL多表查询实例详解【链接查询、子查询等】,包括了MySQL多表查询实例详解【链接查询、子查询等】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了MySQL多表查询。分享给大家供大家参考,具体如下: 准备工作:准备两张表,部门表(department)、员工表(employee) ps:观察两张表,发现department表中id=203部门在employee中没有对应

  • 前面我们介绍了如何使用 SELECT、INSERT、UPDATE 和 DELETE 语句对 MySQL 进行简单访问和操作。下面在此基础上开始学习子查询。 子查询是 MySQL 中比较常用的查询方法,通过子查询可以实现多表查询。 子查询指将一个查询语句嵌套在另一个查询语句中。子查询可以在 SELECT、UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套。在实际开发时,子查询经常出现在

  • 问题内容: 我将使用Sencha Touch将Android-Travellog应用程序移植到其他Plattforms。问题是,Sencha仅具有一个存储系统来存储数据,而似乎没有可能正确地进行MySql查询。而且,由于我以前的应用程序中的大多数Mysql代码已经存在,因此使用Senchas new System重做所有内容时,id会很痛苦。是否可以在Sencha中使用mysql(或任何其他sql

  • 问题内容: 我在MySQL的ExtractValue函数方面有点问题。 这是我的示例XML: 这是我当前的查询: 结果如下: 这是我想要的: 有人可以帮我实现这一点..谢谢。 问题答案: 在这里回答了这个问题: 在MySQL中解析XML字符串 如果将子级更改为“ B”,则该文章中的解决方案应该起作用: