MariaDB使用REGEXP_REPLACE时替换字符串含分号报错如何处理?
问题场景
处理新闻文章内嵌Youtube视频时,需要将旧的<object> Flash HTML标签替换为<iframe>标签。执行替换操作时发现,当替换字符串中包含分号;时,即使对分号做转义处理,数据库仍然会抛出语法错误。
问题SQL代码
UPDATE `news_items` SET `content` = REGEXP_REPLACE(content, '(?sm)<object.*?width\="([0-9]+)".*?height\="([0-9]+)".*?value\="((http://|https://).*?)".*<\/object>', '<iframe width="\\1" height="\\2" src="\\3" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen><\/iframe>') WHERE ID = 9551;
报错触发位置为allow="accelerometer;处。
解决方案
该报错的根本原因是SQL客户端默认将分号;识别为单条SQL语句的结束标记,因此会在替换字符串内第一个分号的位置提前截断语句,导致语法不完整。
无需对替换字符串内的分号做额外转义,通过临时修改SQL语句分隔符即可解决:
- 首先执行语句将SQL分隔符临时修改为
%%(可替换为任意不会出现在当前SQL语句中的特殊字符组合) - 执行上述UPDATE替换语句
- 最后将SQL分隔符改回默认的
;即可
内容的提问来源于stack exchange,提问作者Nique
相关产品推荐
相关产品推荐

