在MySQL Query中使用REPLACE是行不通的

时间:2013-08-27 02:01:39

标签: mysql

快速背景,我有一个带有名为'songs'的表的小型数据库。此表包含我在机器上播放的音乐的标题,艺术家和URL。几个单引号已从轨道标题中删除(例如,不存储为dont),我试图替换它们。我只是不能让这个查询影响任何行:

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

没有爱。这个语法不正确吗?它告诉我0行已更新。 如果它有帮助,我正在运行版本5.5.27。我知道那里有几百行不正确的捐赠...我要将结果转储到记事本中,然后执行查找/替换,并且只是以这种方式运行更新语句,但它有点hacky。有想法的朋友吗?

几个示例行:

"51","Dont Stay Home","311","311 Greatest Hits","Rap","E:\Music\311\311GreatestHits\dontstayhome.mp3"
"229","Dont Turn Around","Ace Of Base","The Very Best Of","Dance","E:\Music\AceofBase\VeryBestOf\03-ace_of_base-dont_turn_around.mp3"

按顺序排列的字段是id,title,artist,album,genre,path

2 个答案:

答案 0 :(得分: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 演示

答案 1 :(得分:0)

首先想到的可能是一些看不见的角色。以下是什么回报?

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

编辑:

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

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

documentation

中对此进行了解释
  

请注意

     

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

编辑II:

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

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