MySQL是否存在不区分大小写的Replace
?
我正在尝试用段落文本中的新用户名替换用户的旧用户名。
$targetuserold = "@".$mynewusername;
$targetusernew = "@".$newusername;
$sql = "
UPDATE timeline
SET message = Replace(message,'".$targetuserold."', '".$targetusernew."')
";
$result = mysql_query($sql);
这缺少旧用户名是不同情况的实例。示例:在我的数据库中的所有行中将“Hank”替换为“Jack”将留下“hank”的实例。
答案 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的积分,我从中得到了这个想法。