【问题标题】:mysql regexp_replace with updatemysql regexp_replace 更新
【发布时间】: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”。

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

【问题讨论】:

标签: mysql regexp-replace


【解决方案1】:

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

我会尝试在bugs.mysql.com 中报告错误。错误已经报告,Bug #90803 regexp_replace accumulating resultBug #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 条件,查询将检查所有行并在匹配正则表达式条件时更新。当你有更多的行时,它会消耗更多的时间,所以我们只需要先过滤行,然后进一步替换列。希望它有所帮助;)
猜你喜欢
  • 1970-01-01
  • 2022-06-23
  • 2019-02-04
  • 2021-01-07
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
相关资源
最近更新 更多