【问题标题】:MySQL regexp for emoji / unicode表情符号/ unicode的MySQL正则表达式
【发布时间】:2019-05-10 00:37:52
【问题描述】:

我想在我的数据库中搜索任何包含蝴蝶表情符号的字符串 - ???? - 使用 regexp

例如

SELECT *
     FROM   `table`
     WHERE  `text`
     REGEXP '????'

我使用REGEXP 是因为我可能想搜索Hello[[:space:]]world 或类似的。

我得到了错误

从正则表达式得到错误“在偏移量 0 处没有重复内容”

这行得通:

SELECT *
     FROM   `table`
     WHERE  `text`
     LIKE   '%????%'

但后来我失去了搜索flying[[:space:]]????的能力

我的排序规则是utf8mb4_unicode_ci。数据库是10.0.36-MariaDB

【问题讨论】:

  • 如果它使用 utf-16,你应该使用代理对 '\uD83E\uDD8B',否则使用代码点 '\U0001F98B'
  • @sln - 问题中提供的文本是 UTF-8(十六进制 F09FA68B),而不是 utf-16。不要使用CHARACTER SET utf16,也不要使用\u 代码。
  • @RickJames - 好的,没做多少研究。数字 1:如果使用 MySQL 8.0.4 或更高版本,则使用 ICU 正则表达式引擎。数字 2:必须转义反斜杠才能获得引擎的反斜杠。数字 3:ICU 中的代码点表示法使用构造 \x{}。数字 4:必须使用 REGEXP 关键字。数字 5:有时目标是 utf-16,否则是 utf-8/32。因此,如果您有已知的 mbcs,请先将其转换为 8/16/32。把它放在适当的位置,试试这个。 REGEXP '\\x{D83E}\\x{DD8B}'REGEXP '\\x{1F98B}'
  • dbfiddle.uk/… 我选择了 MySQL 版本 8。我认为 mariadb 不像 MySQL 那样使用 ICU 引擎,因为它是正则表达式。所以,祝你好运..

标签: mysql regex unicode mariadb emoji


【解决方案1】:

老实说,我不知道为什么,但是逃离你的蝴蝶会得到想要的输出。 (至少在我的版本 MariaDB 10.3.10 中,它给出了相同的错误而没有转义)。

SELECT * FROM `table` WHERE `text` REGEXP '\\?'

(注意双反斜杠,第一个是转义字符串中的反斜杠,在正则表达式中产生\?

【讨论】:

  • 有趣。当我尝试这样做时,它会找到任何带有 ? 字符的文本 - 以及带有 ? 的文本。很奇怪!所以你的回答让我更接近 - 但它并不适合我。
  • @TerenceEden:我无法重现该问题,请参阅dbfiddle
  • 那个小提琴正在使用 MariaDB 10.3.11。我正在使用 10.0.36。我怀疑这就是原因。
  • 我也在使用 10.3,但出现了同样的错误(尽管我只在带有单个蝴蝶的正则表达式上遇到了该错误,而不是 flying[[:space:]] 前缀)。也许一些服务器或连接设置?或者我的情况可能是 PhpMyAdmin 出错了......
  • 这帮助我在 MariaDB 10.1.44 上搜索 (foo|?|baz)。更改为 (foo|\\?|baz) 按预期执行搜索,没有错误。在每种情况下,所有字符集(客户端、数据库等)都已正确设置。
【解决方案2】:
SHOW VARIABLES LIKE 'char%';

听起来你还没有告诉 MySQL client 对字符使用什么编码。这最好通过连接参数或mysqli_charset(如果使用mysqli,而不是PDO)来完成。

另外,在你的版本上运行这个:

SELECT 'ab' REGEXP '?';

我怀疑它会给你同样的错误信息。

【讨论】:

  • 显示变量给出 character_set_client utf8mb4 character_set_connection utf8mb4 character_set_database latin1 character_set_filesystem binary character_set_results utf8mb4 character_set_server latin1 character_set_system utf8 character_sets_dir /usr/share/mysql/charsets/ 所以看起来正确吗?您对 select 语句中的错误是正确的。
  • 是的,看起来是正确的。见stackoverflow.com/questions/38363566/…中的“问号”
猜你喜欢
  • 2018-05-13
  • 2017-01-24
  • 2014-04-11
  • 2017-06-15
  • 2014-03-05
  • 2017-01-25
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
相关资源
最近更新 更多