为什么UPDATE SET REPLACE()语句匹配行,但什么都不更改且不发出警告?


9

我正在字段中寻找某个字符串,并希望将其替换为新字符串。具体来说,我希望将对一个URL的所有引用都更改为另一个URL。我已经编写了此SQL语句,并mysql>使用MySQL Community Server 5.1.54在CentOS 5.5 上的提示符下运行它。

update [table] set [field] = REPLACE([field],'%domain.com%','%domain.org%');

响应为:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 618  Changed: 0  Warnings: 0

我如何跟踪为什么不进行任何更改?

编辑1:

多亏了Aaron Bertrand,我发现它REPLACE()无法处理通配符,而且我完全错误地使用了它(认为:缺少WHERE子句)。这是我修改后的声明:

UPDATE [table]
SET [column] =
REPLACE (
    [column],
    'companydomain.com',
    'companydomain.org' )
WHERE
    [column]
LIKE
    '%companydomain.com%';

我收到了古老的,熟悉的:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 167  Changed: 0  Warnings: 0

我可能做错了什么?

编辑2:

我会告诉你我在做什么错!我不是在质疑假设。我的假设是,我要替换的字符串全部为小写。WHERE子句返回所有看起来的东西LIKE %companydomain.com%。这包括所有大写排列,例如CompanyDomain.com,CoMpAnYdOmAiN.com等。

它传递给了REPLACE()它,然后严格地寻找companydomain.com,然后将其替换为companydomain.org。

REPLACE (
    [column],
    'companydomain.com',
    'companydomain.org' )

因此,我的记录当然会被退回,但是什么也没有被取代。一旦更改REPLACE()为考虑大写字母,所有记录都将更新,看起来一切都很好。因此REPLACE(),我的方案的正确语法为:

REPLACE (
    [column],
    'CompanyDomain.com',
    'companydomain.org' )

Answers:


12

REPLACE不会这样使用通配符。我想你的意思是:

UPDATE [table] 
  SET [column] = REPLACE([column],'TLD.com','TLD.org')
  WHERE [column] LIKE '%TLD.com%';

您没有WHERE子句,因此它尝试更新618行,但%TLD.com%在该列中未找到的任何实例。要查看哪些行应受到影响,请运行a SELECT

SELECT [column], REPLACE([column], 'TLD.com', 'TLD.org') AS new_value
  FROM [table]
  WHERE [column] LIKE '%TLD.com%';

0

首先,我们必须使用select查询进行检查:

SELECT * FROM colleges
WHERE course_name LIKE '%&amp%'

接下来,我们必须更新:

UPDATE colleges
SET course_name = REPLACE(course_name, '&amp', '&')
WHERE id = 1

结果:Cloud &amp Enterprise ComputingCloud & Enterprise Computing

最后,我们必须申请所有:

UPDATE colleges
SET course_name = REPLACE(course_name, '&amp', '&')

结果:Corporate &amp Insolvency LawCorporate & Insolvency Law

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.