MySQL UPDATE REPLACE无法替换特殊字符(如ü转ü)的解决方法
解决MySQL中特殊字符(如ü替换为ü)的替换问题
这种特殊字符替换失败的情况,十有八九是字符编码不匹配搞的鬼——毕竟Ãü本质上就是ü因为编码错误(比如存储/读取时用了不同的字符集)显示出来的乱码形式。我之前处理过好几个类似的场景,给你几个靠谱的解决思路:
第一步:先搞清楚编码现状
在动手替换前,得先确认你的数据库、表、字段以及当前连接的编码是否一致,这是问题的根源:
- 查看数据库默认编码:
SELECT @@character_set_database; - 查看表的编码设置:
SHOW CREATE TABLE your_table_name; - 查看字段的具体编码:
SHOW FULL COLUMNS FROM your_table_name; - 查看当前MySQL连接的编码:
SELECT @@character_set_connection;
方法一:确保连接编码正确后再替换
如果你的连接编码和数据库/字段编码不匹配,你输入的ü可能会被转成其他乱码,导致REPLACE找不到目标字符。先统一编码再执行替换:
比如如果数据库用的是utf8mb4(推荐的UTF-8完整支持),先执行:
SET NAMES utf8mb4;
然后再执行替换语句:
UPDATE your_table SET your_column = REPLACE(your_column, 'ü', 'ü') WHERE your_column LIKE '%ü%';
方法二:用十六进制值替换,彻底避免编码歧义
有时候客户端的编码设置会干扰你输入的字符,导致MySQL识别的不是你想替换的内容。这时候用十六进制表示字符就稳了:
- 先查清楚你要替换的乱码和目标字符的十六进制值:
SELECT HEX('Ãü') AS wrong_hex, HEX('ü') AS correct_hex; - 用十六进制直接替换(比如假设查出来
Ãü是C383C3BC,ü是C3BC):
或者更简洁的写法:UPDATE your_table SET your_column = REPLACE(your_column, UNHEX('C383C3BC'), UNHEX('C3BC')) WHERE your_column LIKE CONCAT('%', UNHEX('C383C3BC'), '%');UPDATE your_table SET your_column = REPLACE(your_column, 0xC383C3BC, 0xC3BC) WHERE your_column LIKE '%' 0xC383C3BC '%';
方法三:批量修复字段编码(如果是全局乱码)
如果不止这一个字符乱码,而是整个字段的编码都不对(比如字段设成了latin1但实际存储的是UTF-8数据),那直接修复编码比一个个替换高效多了:
注意:操作前一定要备份表!
-- 先备份表 CREATE TABLE your_table_backup LIKE your_table; INSERT INTO your_table_backup SELECT * FROM your_table; -- 先把字段改成二进制(避免转换时再次乱码) ALTER TABLE your_table MODIFY your_column BINARY(255); -- 替换成你的字段长度 -- 再把字段改回UTF-8编码 ALTER TABLE your_table MODIFY your_column VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
重要提醒
不管用哪种方法,一定要先在备份表或者测试环境验证,确认替换结果正确后再操作生产数据,避免误操作导致数据丢失。
内容的提问来源于stack exchange,提问作者medk
相关产品推荐
相关产品推荐

