我的列中有一个数据库:
如果我在https://regex101.com/中运行正则表达式^(.*\s)*(angles?)(\s.*)*$
,并提出字符串列表,我会得到第5行和第6行的匹配,一切都是正常的。如果我运行正则表达式^(?:.*\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!
对此有什么合理的解释吗?
谢谢你的帮助。
发布于 2018-07-05 08:22:06
MySQL (直到8.0?)有一个相当差劲的regexp解析器--几个反斜杠或环视操作符。MariaDB 10.0有一个更好的版本,可能可以处理您尝试的内容。
此外,MySQL的regexp只处理字节,不处理多字节字符。根据CHARACTER SET
,é
可能是latin1十六进制E9
或utf8十六进制C3 A9
。后者会被错误地视为2个字符。
你想要什么?只有第5行和第6行?那么一行开头的angles
如何呢?那Los Angles
呢?(是的,拼写错误。)
获取5和6:REGEXP ' angle'
要添加行首:REGEXP '(^| )angle'
是的,在s?
上添加将允许可选的复数。
此外,[[:<:]]sangle[[:>:]]
会发现sangle
是一个“单词”--即前后都有空格、字符串的开始/结束、标点符号等。
https://stackoverflow.com/questions/51180416
复制相似问题