【问题标题】:MySQL: Is it safe to lowercase or uppercase regular expression?MySQL:小写或大写正则表达式是否安全?
【发布时间】:2013-05-17 07:22:09
【问题描述】:

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

以下会导致任何问题吗?

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

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

MySQL documentation:

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

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

【问题讨论】:

  • 其中Langugae。您可以使用语言特定的方法,
  • 我将问题更新为更具体。
  • 你确定正则表达式是最好的工具吗?我知道问题中的代码只是一个示例,但大多数时候您可以使用LIKE
  • 我的应用程序接受正则表达式作为用户的输入,所以没有其他办法了。

标签: mysql regex case-sensitive case-insensitive


【解决方案1】:

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 不区分大小写,除非与二进制字符串一起使用。

【讨论】:

  • 抱歉,我将问题更新为更具体。我没有可用的i 标志。
【解决方案2】:

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

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

小写或大写\W\w 可以完全改变正则表达式的含义。由此得出以下结论:

  • 目前的解决方案是行不通的。
  • 提供的解决方案是可能的,但正则表达式必须以更复杂的方式小写,而不仅仅是使用LOWER 或类似的东西。必须对其进行解析,并且必须小心更改大小写。

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多