MySQL查询表中含URL的行REGEXP报重复操作数无效错误怎么解决?
报错原因
你遇到的#1139报错是因为MySQL 8.0版本以前的REGEXP运算符不支持非捕获组语法(?:...),你的正则语句中使用了非捕获组,是触发该错误的直接原因。
修复后的SQL语句
把正则中的非捕获组替换为普通捕获组即可正常执行,同时为了避免关键字冲突,建议用反引号包裹表名和字段名:
SELECT * FROM `table` WHERE `text` REGEXP '((http|ftp|https)://([\\w_-]+((\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?)'
如果你使用的是MySQL 8.0及以上版本,也可以使用兼容性更好的REGEXP_LIKE函数:
SELECT * FROM `table` WHERE REGEXP_LIKE(`text`, '((http|ftp|https)://([\\w_-]+((\\.[\\w_-]+)+))([\\w.,@?^=%&:/~+#-]*[\\w@?^=%&/~+#-])?)')
上述语句可以正常匹配到你示例中包含URL的字段内容,筛选结果符合预期。
注意事项
- MySQL正则语法中
/不属于特殊字符,不需要额外添加反斜杠转义 - 涉及表名、字段名与MySQL保留关键字重名时,必须用反引号包裹避免语法错误
内容的提问来源于stack exchange,提问作者KANAYO AUGUSTIN UG
相关产品推荐
相关产品推荐

