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

如何使MySQL意识到LIKE和REGEXP中的多字节字符?

柳羽
2023-03-14
问题内容

我有一个包含两列的MySQL表,这两列都是utf8_unicode_ci整理的。它包含以下行。除ASCII外,第二个字段还包含Unicode代码点,例如U
+ 02C8(修改后的字母垂直行)和U + 02D0(修改后的字母三角形冒号)。

 word   | ipa
--------+----------
 Hallo  | ha藞lo藧
 IPA    | 藢i藧pe藧藞蕯a藧

我需要使用LIKE和REGEXP搜索第二个字段,但是MySQL(5.0.77)似乎将这些字段解释为字节,而不是字符。

SELECT * FROM pronunciation WHERE ipa LIKE '%ha?lo%';  -- 0 rows
SELECT * FROM pronunciation WHERE ipa LIKE '%ha??lo%'; -- 1 row

SELECT * FROM pronunciation WHERE ipa REGEXP 'ha.lo';  -- 0 rows
SELECT * FROM pronunciation WHERE ipa REGEXP 'ha..lo'; -- 1 row

我非常确定数据存储正确,因为在检索数据时它看起来不错,并且在phpMyAdmin中显示得很好。我在共享主机上,因此无法真正安装程序。

我怎么解决这个问题?如果不可能:是否有一个可行的解决方法,该方法不涉及每次都使用PHP处理整个数据库?有4万行,对于使用MySQL(就此而言,还是使用UTF8),我并没有犹豫。我只能在主机上访问PHP和MySQL。

编辑: 有一个开放的有4年历史的MySQL错误报告,
错误#30241正则表达式问题,它指出regexp引擎按字节工作。因此,我正在寻找解决方法。


问题答案:

编辑以合并修正有效的批评

使用该HEX()函数将您的字节呈现为十六进制, 然后RLIKE在其上使用,例如:

select * from mytable
where hex(ipa) rlike concat('(..)*', hex('needle'), '(..)*'); -- looking for 'needle' in haystack, but maintaining hex-pair alignment.

奇数unicode字符始终以其十六进制值呈现,因此您正在搜索标准0-9A-F字符。

这也适用于“普通”列,您只是不需要它。

ps @Kieren的(有效)点已rlike用于强制执行字符对



 类似资料:
  • 本文向大家介绍如何使用MySQL LIKE提取具有多个值的字段?,包括了如何使用MySQL LIKE提取具有多个值的字段?的使用技巧和注意事项,需要的朋友参考一下 要获取具有多个值的字段,请在MySQL中将LIKE与OR配合使用- 您可以借助表格来了解- 借助insert命令将一些记录插入表中。在表中插入记录的查询如下- 以下是输出- 使用LIKE获取具有多个值的字段的查询如下- 以下是输出-

  • 问题内容: 我试图找到匹配特定模式的行数。在此示例中,所有以“ 123”开头的内容: 这正在工作: 问题是LIKE会有所不同,所以我试图在脚本中定义它,然后执行查询,但这不起作用: 在第二个示例中,如何使该查询正常工作? 编辑:我也尝试了没有期限(也无法正常工作): 问题答案: 您的语法错误;无需在双引号字符串内放置句点。相反,它应该更像 您可以通过打印出字符串以确认与第一种情况相同来确认这一点。

  • 本文向大家介绍mysql模糊查询like和regexp小结,包括了mysql模糊查询like和regexp小结的使用技巧和注意事项,需要的朋友参考一下 在mysql中实现模糊查询的有like和regexp。 ------------------------ like的用法许多人都是知道的,最为常用的情况就是select * from a where name like '%a%'; 其中'%'代表

  • Javascript ArrayBuffer或TypedArrays没有任何类型的appendByte()、appendBytes()或appendBuffer()方法。所以,如果我想一次填充一个数组缓冲一个值,我该怎么做呢?

  • 1. 定义 慕课解释:Like和Regexp操作符一般与Where搭配用于搜索和匹配字符字段。 2. 前言 本小节中,我们将一起学习SQL Like和 SQL Regexp的基本使用。 很多时候,数据表中存储了大量的字符类型字段,如 varchar 和 char 。虽然它们可以和其它类型字段一样通过 > ,= 等基本运算符进行比较和操作。但是字符串的特性较为复杂,当需要字符串匹配时,基本运算符就无

  • 问题内容: 我目前正在使用类似下面的mysql语句来搜索帖子标题。 但是问题是,如果标题是:并且用户搜索,它将返回结果。但是,如果用户搜索或,则不会返回任何内容。 当用户搜索多个单词时,是否有办法使它返回结果?就是在这里使用了正确的事情还是有别的东西可以用吗? 问题答案: 您可以使用REGEXP来匹配搜索字符串中的任何单词: 请注意,这将不是很有效。在这里看小提琴。 如果需要匹配字符串中的每个单词