我使用PHP访问mysql数据库字段,每条记录最多包含2500个字符。我希望构建的查询将只返回包含单个单词的记录,如“taco”。
然而,有时用户需要搜索像“jalapeno”这样的单词。除了jalapeno可能以'jalapeno‘或'jalapeño’的形式存在于数据库之外。查询应该返回两个实例。
更复杂的是,用户可能还需要搜索像“creme”这样的词,它可能会出现为“creme”或“créme”,但绝不会出现为“crémé”。
看起来我应该能够构造一些东西,它使用一个替换,然后是一个正则表达式,这样字母'n‘总是被替换为'n|ñ',然后搜索一个带有嵌入正则表达式的字符串,比如:'jalapen|ño’。除非那不起作用。MySQL将RegEx语法视为文字。
以下所有结果都不会返回我要查找的结果:
SELECT id, record FROM table WHERE record like '%jalapeno%';
SELECT id, record FROM table WHERE record REGEXP 'jalapeno';
SELECT id, record FROM table WHERE record REGEXP 'jalape[n|ñ]o';
SELECT id, record FROM table WHERE REGEXP_LIKE(record, 'jalape[n|ñ]o', 'im');此外,我可以使用PHP来替换潜在的字符,但最终得到的结果如下: SELECT id,record FROM table WHERE (记录如'%creme%‘||记录如'%crémé%');
我可以使用这样的搜索,但以编程方式构建它似乎过于复杂:
SELECT id, record FROM table WHERE (record like '%creme%' || record like '%crémé%' || record like '%cremé%' || record like '%cremé%' );有没有一个MySQL方法可以提供一个嵌入到字符串中的REGEX 'OR‘?可能是这样的:
SELECT id, record FROM table WHERE record like '%cr[e|é]m[e|é]%' ;或者,是否有其他解决方案不需要构造过于复杂的SQL语句?
发布于 2021-05-18 13:33:52
感谢那些花时间试图弄清楚这一点的人。
如上所述,对于当前版本,REGEXP_LIKE()似乎不是一个有效的MySQL函数。
这是我的解决方案;请注意,这适用于MySQL 5.7.x。
SELECT id, record FROM table WHERE record RLIKE 'jalape(n|ñ)o';
https://stackoverflow.com/questions/67578452
复制相似问题