【问题标题】:Mysql regex error #1139 using literal -Mysql 正则表达式错误 #1139 使用文字 -
【发布时间】:2015-07-31 16:34:37
【问题描述】:

我尝试运行此查询:

SELECT column FROM table WHERE column REGEXP '[^A-Za-z\-\']'

但这会返回

#1139 - 从正则表达式中得到错误“无效字符范围”

在我看来,字符类中的 - 没有被转义,而是被读取为无效范围。是否有其他方式可以让 mysql 转义为文字 -

这个正则表达式在 mysql 之外按预期工作,https://regex101.com/r/wE8vY5/1

我想出了一个替代正则表达式的方法

SELECT column FROM table WHERE column NOT REGEXP '([:alpha:]|-|\')'

所以问题不在于我如何让它发挥作用。问题是为什么第一个正则表达式不起作用?

这是问题的 SQL 小提琴,http://sqlfiddle.com/#!9/f8a006/1

此外,这里没有使用任何语言,查询正在数据库级别运行。

PHP 中的正则表达式:http://sandbox.onlinephpfunctions.com/code/10f5fe2939bdbbbebcc986c171a97c0d63d06e55

JS 中的正则表达式:https://jsfiddle.net/6ay4zmrb/

【问题讨论】:

  • 这实际上在 MySQL 8 中有效,但在 5.7 中无效

标签: mysql regex escaping


【解决方案1】:

只需更改顺序即可。

SELECT column FROM table WHERE column REGEXP '[^-A-Za-z\']'

【讨论】:

  • 是的,更改订单有效。但是不支持转义吗?
  • 你用的是什么工具?如果该字符串在 PHP 中,则需要 2 级转义,一种用于 PHP,另一种用于 SQL。
  • @RickJames 我直接在 phpmyadmin 中运行查询,没有中介。我也尝试过双重转义,它也没有用。 sqlfiddle.com/#!9/f8a006/1
  • 有趣的是,改变顺序是可行的,- 根本不需要转义。
  • - 是一种特殊情况,因为它用于“范围”的语法中。把它放在第一位,显然它不是一个范围的语法,所以它可以被视为一个普通字符。同样,其中一些:^$+* 根据上下文改变其含义。
【解决方案2】:

@Avinash Raj 是正确的,- 必须是第一个(或最后一个)。 \ 不是 POSIX 中的转义字符,这是 mysql 使用的 https://dev.mysql.com/doc/refman/5.1/en/regexp.html

一个关键的语法差异是反斜杠不是 POSIX 括号表达式中的元字符。

-http://www.regular-expressions.info/posixbrackets.html

What special characters must be escaped in regular expressions?

在字符类中,反斜杠是 POSIX 正则表达式中的文字字符。你不能用它来逃避任何事情。如果要将字符类元字符包含为文字,则必须使用“巧妙的放置”。将 ^ 放在除开头之外的任何位置,将 ] 放在开头,将 - 放在字符类的开头或结尾以匹配这些字面

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 2015-01-31
    • 2016-05-27
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多