如何使用mySQL replace()在多个记录中替换字符串?

186

我们有一个数据库,其中一个列中包含一些坏数据。在此列中,嵌入式编辑器转义了一些不应该转义的内容,这破坏了生成的链接。

我想运行一个查询来替换所有记录中的坏字符,但是我无法弄清如何做到这一点。我在MySQL中找到了replace()函数,但是我怎么在查询中使用它呢?

例如,如果我想将字符串&lt;替换为实际的小于号(<)在所有具有articleItem列中含有&lt;的记录中,正确的语法是什么?它可以在单个查询中完成吗(即选择并替换所有内容),还是必须执行多个查询? 即使是多个查询,如何使用replace()对一个以上记录中字段的值进行替换?


5
在执行任何操作之前,请确保备份数据库。您还可以使用“update”来更新任何字段。 - Matt
1
可能是重复的问题:MySql - Way to update portion of a string? - Ciro Santilli OurBigBook.com
可能是MySQL搜索和替换字段中的一些文本的重复问题。 - zgormez
5个回答

444

从一个非常通用的层面来看

UPDATE MyTable

SET StringColumn = REPLACE (StringColumn, 'SearchForThis', 'ReplaceWithThis')

WHERE SomeOtherColumn LIKE '%PATTERN%'

根据您的说法,这些字符已被转义,但由于您未指定它们是如何转义的,我们假设它们已被转义为GREATERTHAN

UPDATE MyTable

SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>')

WHERE articleItem LIKE '%GREATERTHAN%'

因为你的查询实际上将在字符串内部运行,所以你的 WHERE 子句进行的模式匹配不太可能提高任何性能 - 它实际上会为服务器生成更多的工作量。除非你有另一个 WHERE 子句成员可以使这个查询表现得更好,否则你可以像这样简单地进行更新:

UPDATE MyTable
SET StringColumn = REPLACE (StringColumn, 'GREATERTHAN', '>')

您还可以嵌套多个REPLACE调用。

UPDATE MyTable
SET StringColumn = REPLACE (REPLACE (StringColumn, 'GREATERTHAN', '>'), 'LESSTHAN', '<')

在选择数据时,您也可以这样做(而不是保存数据时)。

所以,不是:

SELECT MyURLString From MyTable

您可以这样做:

SELECT REPLACE (MyURLString, 'GREATERTHAN', '>') as MyURLString From MyTable


7
小问题:GREATERTHAN是'>'。 - Olivier Dulac

29
UPDATE some_table SET some_field = REPLACE(some_field, '&lt;', '<')

修复了&lt;的问题。你需要使用&符号的编码,像这样:&amp; :) - Dan J
我重新编辑了它。谢谢你让我知道。我说不知道怎么做后,几分钟后我恍然大悟。这就是我的世界运作方式。 :) - simshaun
谢谢!这个完美地运行了。在一个巨大的博客数据库中,将域名URL更新为子字符串替换! - xero

7

请检查此内容

UPDATE some_table SET some_field = REPLACE("Column Name/String", 'Search String', 'Replace String')

例如,有一个示例字符串:
UPDATE some_table SET some_field = REPLACE("this is test string", 'test', 'sample')

例如,带有列/字段名称的示例:

UPDATE some_table SET some_field = REPLACE(columnName, 'test', 'sample')

4
您可以编写类似以下的存储过程:

CREATE PROCEDURE sanitize_TABLE()

BEGIN

#将空格替换为下划线

UPDATE Table SET FieldName = REPLACE(FieldName," ","_") WHERE FieldName 不为空;

#删除句号

UPDATE Table SET FieldName = REPLACE(FieldName,".","") WHERE FieldName 不为空;

#删除左括号

UPDATE Table SET FieldName = REPLACE(FieldName,"(","") WHERE FieldName 不为空;

#删除右括号

UPDATE Table SET FieldName = REPLACE(FieldName,")","") WHERE FieldName 不为空;

#替换或删除您想要的任何字符

#..........................

END

这样,您就可以模块化地控制表格。
您还可以将存储过程通用化,使其成为具有清洗输入参数表的参数化存储过程。

1
这些空值检查是多余的。 - kiedysktos
有没有一些简单而安全的工具可以创建MySQL存储过程? - Ivan Slaughter

1
这将会帮助你。
UPDATE play_school_data SET title= REPLACE(title, "&#39;", "'") WHERE title = "Elmer&#39;s Parade";

结果:

title = Elmer's Parade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接