1

快速背景,我有一个带有名为“歌曲”的表的小型数据库。此表包含我机器上音乐的标题、艺术家和 URL。从曲目标题中删除了几个单引号(例如,don't 存储为 dont),我正在尝试替换它们。我只是不能让这个查询影响任何行:

UPDATE Songs
SET Title = REPLACE (Title, 'dont', 'don\'t')

没爱。这不是正确的语法吗?它告诉我更新了 0 行。如果有帮助,我正在运行 5.5.27 版。我知道那里有几百行不正确的donts...我即将将结果转储到记事本中并在don't上进行查找/替换,然后以这种方式运行更新语句,但这有点hacky。有什么想法的朋友吗?

几个示例行:

"51","Dont Stay Home","311","311 Greatest Hits","Rap","E:\Music\311\311GreatestHits\dontstayhome.mp3"
“229”,“不要转身”,“基地王牌”,“最好的”,“舞蹈”,“E:\Music\AceofBase\VeryBestOf\03-ace_of_base-dont_turn_around.mp3”

按顺序排列的字段是 id、标题、艺术家、专辑、流派、路径

4

2 回答 2

1

你必须这样做

UPDATE Songs
    SET Title = REPLACE(Title, 'Dont', 'Don\'t');
                                ^       ^

原因是

REPLACE(str,from_str,to_str)

返回字符串 str,其中所有出现的字符串 from_str 都替换为字符串 to_str。REPLACE() 在搜索 from_str 时执行区分大小写的匹配

如果你想更换任何一种情况,你可以做

UPDATE Songs 
   SET Title = REPLACE(REPLACE(Title, 'Dont', 'Don\'t'), 'dont', 'don\'t')
 WHERE Title LIKE '%dont%' -- it makes sense to limit update to only those rows that have dont in it no matter case

这是SQLFiddle演示

于 2013-08-27T02:56:00.337 回答
0

第一个想法是可能有一些看不见的字符。以下返回什么?

select *
from songs
where title like '%dont%';

编辑:

起初我没有注意到这一点。问题是函数名后面的空格。尝试这个:

UPDATE Songs
    SET Title = REPLACE(Title, 'dont', 'don\'t');

这在文档中进行了解释:

笔记

默认情况下,函数名和它后面的括号之间不能有空格。这有助于 MySQL 解析器区分函数调用和对碰巧与函数同名的表或列的引用。但是,允许函数参数周围有空格。

编辑二:

不知道整理有没有效果。但您也可以尝试使用双引号作为字符串分隔符:

UPDATE Songs
    SET Title = REPLACE(Title, 'dont', "don't");
于 2013-08-27T02:06:07.263 回答