Mysql正则表达式错误#1139使用文字 -

时间:2015-07-31 16:34:37

标签: mysql regex escaping

我尝试运行此查询:

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

但是会返回

  

#1139 - 出现错误'无效字符范围'来自regexp

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

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

我提出了另一种正则表达式

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

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

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

此外,这里没有使用语言,查询正在DB级别运行。

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

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

2 个答案:

答案 0 :(得分:3)

只需更改订单。

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

答案 1 :(得分:3)

@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正则表达式中的文字字符。你不能用它来逃避任何事情。你必须使用"聪明的位置"如果要将字符类元字符包含为文字。将^除了在开头处,在开头处,以及 - 在字符类的开头或结尾处 - 以匹配这些字面意义