mysql regexp_replace 更新

Posted

技术标签:

【中文标题】mysql regexp_replace 更新【英文标题】:mysql regexp_replace with update 【发布时间】:2018-10-22 21:00:06 【问题描述】:

我刚刚将 mysql 升级到 8.0.11 以便能够使用 regexp_replace。它在 select 语句中工作正常,但是当我在更新中使用它时,我得到了奇怪的结果。这是一个简化的示例:如果我有一个带有“567890”的字段,并且我用这个更新了它:

update test set field = regexp_replace(field, '[7]', 'z')

字段值设置为“56”,而不是“56z890”。

这一定是一个错误,但与此同时,是否有任何变通方法可以使其按预期工作?谢谢。

【问题讨论】:

可能是存储函数dev.mysql.com/doc/refman/8.0/en/show-create-procedure.html 该字段可能是数字吗? 【参考方案1】:

它看起来像 REGEXP_REPLACE 函数的错误。在 MariaDB 中,它按预期工作,请参阅 dbfiddle。

我会尝试在bugs.mysql.com 中报告错误。错误已经报告,Bug #90803 regexp_replace accumulating result 和Bug #90870 REGEXP_REPLACE truncate UPDATE。

解决方法是:

UPDATE `test`
SET `field` = CAST(REGEXP_REPLACE(`field`, '[7]', 'z') AS CHAR);

见dbfiddle。

【讨论】:

是的,该解决方法确实修复了它以替换一条记录。然后我在一组记录上测试了一个 SELECT,输出以某种方式将一条记录的结果添加到下一条记录的结果中。所以到最后它是所有先前记录的串联。用实际更新来做可能是灾难性的,所以我想我会等到下一个版本出来。再次感谢。 Bug #90803 描述了我在之前的评论中发现的第二个问题。但这似乎与我原来的问题不同,其中单行上的替换会截断结果。 @RayGurganus:报告了新的错误,Bug #90870。查看更新的答案。【参考方案2】:

我正在使用 Apache 版本 (PHP) 5.6MySQL 版本 10.1.25-Maria DB 本地主机服务器。

我已尝试使用以下查询,

UPDATE `table_name` 
SET         
    column_name = REGEXP_REPLACE(column_name,regex_pattern_to_find,replaceable_text)
WHERE
    column_name RLIKE 'regex_pattern_to_find'

它对我来说很好用。希望这会有所帮助。

【讨论】:

当 regexp_replace 已经替换了目标模式时,为什么要使用 where 条件进行过滤?某种安全性? @Heraknos 如果您不添加 where 条件,查询将检查所有行并在匹配正则表达式条件时更新。当你有更多的行时,它会消耗更多的时间,所以我们只需要先过滤行,然后进一步替换列。希望它有所帮助;)

以上是关于mysql regexp_replace 更新的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL RETURNING 失败并出现 REGEXP_REPLACE

想更改为每个单词的结尾而不是字符串的结尾(匹配) - MariaDB/MySQL + REGEXP_REPLACE

来自 PCRE REGEXP 的 MySQL REGEXP_REPLACE 翻译

正则表达式为mysql正则表达式

无法将多条记录更新到mysql

MYSQL - 表未从过程更新