为什么此正则表达式可用于PHP测试,但不适用于MySQL?

时间:2018-07-04 20:30:02

标签: mysql regex

我在列中有一个数据库:

  1. 弯角D Arrimageà球拍
  2. 角度
  3. 传递倒角
  4. 弯角(seule)
  5. Patins GlisseurTéflon角
  6. 夏尼尔角

如果我在https://regex101.com/中运行正则表达式^(.*\s)*(angles?)(\s.*)*$,并提出字符串列表,则我得到第5行和第6行的匹配项,一切都OK。如果我运行正则表达式^(?:.*\s)*(sangles?)(?:\s.*)*$,则会得到与第1、2、3、4行的匹配,也可以。

现在,如果y将相同的正则表达式放入SQL请求中(在phpmyadmin上):

SELECT * FROM magasin_article AS mag
WHERE mag_art_libelle REGEXP '^(.*\s)*(angles?)(\s.*)*$'

我得到1,2,3,4行!

根据请求:

SELECT * FROM magasin_article AS mag
WHERE mag_art_libelle REGEXP '^(.*\s)*(sangles?)(\s.*)*$'

我得到结果1,2,4!

对此有合理的解释吗?

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

MySQL(直到8.0?)的Regexp解析器相当la脚-反斜杠或环视运算符很少。 MariaDB 10.0具有更好的版本,可能可以处理您尝试的内容。

此外,MySQL的正则表达式仅处理字节,而不处理多字节字符。根据{{​​1}},CHARACTER SET可能是latin1 hex é或utf8 hex E9。后者将被错误地视为2个字符。

你想要什么?只有第5和第6行?行首的C3 A9呢? angles呢? (是的,拼错了。)

要获得5和6:Los Angles

要插入行首:REGEXP ' angle'

是的,在REGEXP '(^| )angle'处添加小数点即可。

此外,s?会发现[[:<:]]sangle[[:>:]]是一个“单词”,即空格,字符串的开头/结尾,标点符号等。