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

Wes*_*ley 9 mysql dml

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

update [table] set [field] = REPLACE([field],'%domain.com%','%domain.org%');
Run Code Online (Sandbox Code Playgroud)

回应是:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 618  Changed: 0  Warnings: 0
Run Code Online (Sandbox Code Playgroud)

我怎样才能追踪为什么没有进行任何更改?

编辑 1:

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

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

我收到旧的,熟悉的:

Query OK, 0 rows affected (0.02 sec)
Rows matched: 167  Changed: 0  Warnings: 0
Run Code Online (Sandbox Code Playgroud)

我可能做错了什么?

编辑2:

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

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

REPLACE (
    [column],
    'companydomain.com',
    'companydomain.org' )
Run Code Online (Sandbox Code Playgroud)

所以当然我的记录被退回了,但没有任何东西被替换。一旦我更改REPLACE()为考虑大写,所有记录都会更新,看起来一切都很好。因此REPLACE(),我的场景的正确语法是:

REPLACE (
    [column],
    'CompanyDomain.com',
    'companydomain.org' )
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 12

REPLACE不会以这种方式使用通配符。我想你的意思是:

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

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

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