1

我在 MySQL 中对多字节编码(utf-8)数据使用正则表达式,但我需要它不区分大小写。由于 MySQL 存在无法正确处理匹配多字节编码字符串不区分大小写的错误(多年未解决),我试图通过小写值和正则表达式模式来模拟“不敏感”。以这种方式小写正则表达式模式是否安全?我的意思是,有没有我忘记的边缘情况?

跟随会导致任何问题吗?

LOWER('šárKA') = REGEXP LOWER('^Šárka$')

更新:我将问题编辑得更具体。

MySQL 文档

REGEXP 和 RLIKE 运算符以字节方式工作,因此它们不是多字节安全的,并且可能会在使用多字节字符集时产生意外结果。此外,这些运算符通过它们的字节值比较字符,即使给定的排序规则将它们视为相等,重音字符也可能不会比较为相等

这是他们在 2007 年提交的错误,直到现在仍未解决。但是,我不能只更改数据库来解决这个问题。我需要 MySQL 以某种方式考虑 'Š' 等于 'š',即使它是通过使用不太优雅的解决方案来破解它。重音(多字节)以外的其他字符匹配良好且没有问题。

4

2 回答 2

3

Regex的i选项将确保它不区分大小写匹配。

例子:

'^(?i)Foo$' // (?i) will turn on case insensitivity for the rest of the regex
'/^Foo$/i'  // the i options turns off case sensitivity

请注意,这些可能不适用于您的特定正则表达式风格(您没有暗示),因此请确保您查阅手册以获取正确的语法。

更新:

从这里:http ://dev.mysql.com/doc/refman/5.1/en/regexp.html

REGEXP 不区分大小写,除非与二进制字符串一起使用。

于 2013-05-17T07:24:17.593 回答
0

由于没有人真正回答我最初的问题,我进行了自己的研究,并意识到在没有任何其他处理的情况下小写或大写正则表达式是不安全的。准确地说,使用理论上的纯正则表达式这样做是安全的,但是它们的每一个健全的实现都会添加一些字符类和特殊指令,这很容易受到大小写变化的影响:

  • 转义序列,如\n,\t等。
  • 字符类,如\W(非字母数字)和\w(字母数字)。
  • 字符类[.characters.],如 ,[=character_class=][:character_class:](MySQL 正则表达式方言)。

小写或大写\W\w可以完全改变正则表达式的含义。这导致以下结论:

  • 提出的解决方案是行不通的。
  • 提出的解决方案是可能的,但正则表达式必须以更复杂的方式小写,而不仅仅是使用LOWER或类似的东西。必须对其进行解析,并且必须仔细更改大小写。
于 2013-05-18T11:43:53.463 回答