我在列中有一个数据库:
如果我在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!
对此有合理的解释吗?
谢谢您的帮助。
答案 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[[:>:]]
是一个“单词”,即空格,字符串的开头/结尾,标点符号等。