如何编写SQL查询将表列编码从cp1251转换为UTF8?
解决CP1251数据存入UTF8表导致的乱码问题
我之前碰到过完全一样的场景——数据库和表都设成了UTF8,但实际存的是CP1251编码的字节,直接改编码只会让乱码更严重。下面给你两个亲测有效的解决方案,操作前记得先备份数据,避免翻车!
方案一:通过Binary类型中转转换编码
这个方法不需要导出导入,直接在数据库内操作,适合单表或少量表的情况:
- 第一步:先备份目标表(保险起见)
mysqldump -u your_username -p your_database your_table > backup_before_fix.sql - 第二步:把表中所有字符类型字段(VARCHAR、TEXT等)改成对应的Binary类型,这样MySQL不会对字节做任何编码转换,只是原样存储:
比如原来的VARCHAR(200)字段,执行:
TEXT字段改成BLOB:ALTER TABLE your_table MODIFY COLUMN your_column VARBINARY(200);
可以用ALTER TABLE your_table MODIFY COLUMN your_text_column BLOB;SHOW COLUMNS FROM your_table;查看所有字段类型,确保所有字符字段都转成Binary类型。 - 第三步:把Binary类型改回UTF8字符类型,此时MySQL会自动把原来的CP1251字节转换成UTF8编码:
TEXT字段改回:ALTER TABLE your_table MODIFY COLUMN your_column VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE your_table MODIFY COLUMN your_text_column TEXT CHARACTER SET utf8 COLLATE utf8_general_ci; - 最后:查询表数据,确认乱码问题解决。
方案二:导出转码后重新导入
这个方法适合批量处理整个数据库或大量表的情况:
- 第一步:用CP1251字符集导出数据(告诉mysqldump,存储的字节实际是CP1251编码):
mysqldump -u your_username -p --default-character-set=cp1251 your_database > dump_cp1251.sql - 第二步:编辑导出的
dump_cp1251.sql文件,把所有DEFAULT CHARSET=cp1251(如果存在)替换成DEFAULT CHARSET=utf8;如果是MySQL 5.5+版本,推荐用utf8mb4代替utf8,支持更多特殊字符。 - 第三步:用UTF8字符集导入数据,MySQL会自动把CP1251编码的内容转换成UTF8存储:
mysql -u your_username -p --default-character-set=utf8 your_database < dump_cp1251.sql - 最后:验证数据显示是否正常。
注意事项
- 无论用哪个方案,备份永远是第一步,防止操作失误导致数据丢失。
- 如果你的MySQL版本支持utf8mb4,建议全程用utf8mb4代替utf8,避免后续遇到 emoji 等特殊字符的存储问题。
内容的提问来源于stack exchange,提问作者Eugene Kotov
相关产品推荐
相关产品推荐

