用于MySQL的Case Insensitive REPLACE

时间:2014-01-19 21:00:30

标签: mysql replace

MySQL是否存在不区分大小写的Replace

我正在尝试用段落文本中的新用户名替换用户的旧用户名。

$targetuserold = "@".$mynewusername;
$targetusernew = "@".$newusername;

$sql = "
    UPDATE timeline 
    SET message = Replace(message,'".$targetuserold."', '".$targetusernew."')
";

$result = mysql_query($sql);

这缺少旧用户名是不同情况的实例。示例:在我的数据库中的所有行中将“Hank”替换为“Jack”将留下“hank”的实例。

3 个答案:

答案 0 :(得分:1)

这是:

DELIMITER $$

DROP FUNCTION IF EXISTS `replace_ci`$$
CREATE FUNCTION `replace_ci` ( str TEXT,needle CHAR(255),str_rep CHAR(255))
    RETURNS TEXT
    DETERMINISTIC
    BEGIN
        DECLARE return_str TEXT DEFAULT '';
        DECLARE lower_str TEXT;
        DECLARE lower_needle TEXT;
        DECLARE pos INT DEFAULT 1;
        DECLARE old_pos INT DEFAULT 1;

        SELECT lower(str) INTO lower_str;
        SELECT lower(needle) INTO lower_needle;
        SELECT locate(lower_needle, lower_str, pos) INTO pos;
        WHILE pos > 0 DO
            SELECT concat(return_str, substr(str, old_pos, pos-old_pos), str_rep) INTO return_str;
            SELECT pos + char_length(needle) INTO pos;
            SELECT pos INTO old_pos;
            SELECT locate(lower_needle, lower_str, pos) INTO pos;
        END WHILE;
        SELECT concat(return_str, substr(str, old_pos, char_length(str))) INTO return_str;
        RETURN return_str;
END$$

DELIMITER ;

用法:

$sql = "
    UPDATE timeline 
    SET message = replace_ci(message,'".$targetuserold."', '".$targetusernew."')
";

答案 1 :(得分:0)

我的解决方案最终是我不能做一个不区分大小写的Replace

然而,我确实找到了解决方法。

我试图提供一个用户可以更改用户名的功能。然后,系统需要更新数据库中所有消息中找到@oldusername的位置。

问题是......人们不会在members表中找到的正确情况下输入其他人的用户名。因此,当用户更改其用户名时,它将无法捕获@oldSeRNAmE的实例,因为它与oldusername的实际格式不匹配。

我没有使用我的GoDaddy共享服务器的权限来使用自定义的SQL函数执行此操作,因此我必须找到不同的方法。

我的解决方案:在向数据库中插入新消息后,只要在新消息中找到用户名,我就会在此时使用UPDATE语句来替换他们输入的用户名在members表中找到的正确格式化案例。这样,如果那个人以后想要更改他们的用户名,那么数据库中该用户名的所有实例都将是完全相同的格式化案例。问题解决了。

答案 2 :(得分:0)

一种没有任何存储功能的简单方法:

SELECT message,
       substring(comments,position(lower('".$targetuserold."') in message) ) AS oldval
  FROM timeline
 WHERE message LIKE '%".$targetuserold."%'

为您提供所有邮件中用户名的准确区分大小写拼写。当你似乎从PHP脚本运行它时,你可以使用它来收集拼写和相应的ID,然后在其上运行一个简单的REPLACE(message,'".$oldval.",'".$targetusernew."')。或者使用以上作为子选择:

UPDATE timeline 
    SET message = REPLACE(
                   message,
                   (SELECT substring(comments,position(lower('".$targetuserold."') in message))),
                   '".$targetusernew."'
                  )

在这里充当魅力。

this article的积分,我从中得到了这个想法。