当你在服务器迁移、数据库备份恢复或环境变更后,迅睿CMS出现以下情况:
根本原因通常为:
登录MySQL执行以下命令:
``` mysql -u root -p show variables like 'character_set%'; show variables like 'collation%'; ```正常情况应显示:
查看具体数据表的字符集:
``` use your_database_name; show table status like 'dr_%'; ```关注dr_1_news、dr_1_page等核心表的Collation字段。
在开始任何修复操作前,必须备份!
``` mysqldump -u root -p --default-character-set=utf8mb4 your_database_name > backup_before_fix.sql ```修改MySQL配置文件my.cnf(Linux)或my.ini(Windows):
``` [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect='SET NAMES utf8mb4' ```重启MySQL服务:
``` Linux系统 systemctl restart mysqld Windows系统 net stop mysql net start mysql ```执行以下SQL语句,将数据库字符集转换为utf8mb4:
``` ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ```生成修复所有表的SQL语句:
``` SELECT CONCAT('ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_TYPE = 'BASE TABLE'; ```执行生成的ALTER语句。
编辑迅睿CMS配置文件/config/database.php:
``` array( 'hostname' => 'localhost', 'database' => 'your_database_name', 'username' => 'your_username', 'password' => 'your_password', 'hostport' => '3306', 'charset' => 'utf8mb4', // 确保这里是utf8mb4 'dbcollat' => 'utf8mb4_unicode_ci', 'prefix' => 'dr_', 'pconnect' => FALSE, ), ); ```如果数据已经乱码,需要重新导入正确编码的备份。先导出当前数据:
``` mysqldump -u root -p --default-character-set=latin1 --skip-set-charset your_database_name > dump_latin1.sql ```然后转换编码:
``` iconv -f latin1 -t utf8mb4 dump_latin1.sql > dump_utf8mb4.sql ```重新导入:
``` mysql -u root -p --default-character-set=utf8mb4 your_database_name < dump_utf8mb4.sql ```
单独修复乱码的表:
``` ALTER TABLE dr_1_news CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE dr_1_news MODIFY title VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ALTER TABLE dr_1_news MODIFY content LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ```检查备份文件编码:
``` file -i backup.sql ```如果不是utf-8,转换编码:
``` iconv -f gbk -t utf8 backup_gbk.sql > backup_utf8.sql 或 iconv -f gb2312 -t utf8 backup_gb2312.sql > backup_utf8.sql ```在PHP连接数据库后立即设置字符集:
编辑/dayrui/core/controllers/Base.php或相关数据库连接文件:
``` $this->db->query("SET NAMES 'utf8mb4'"); $this->db->query("SET CHARACTER SET utf8mb4"); $this->db->query("SET character_set_connection=utf8mb4"); ```在后台发布一篇包含中文的文章:
``` 测试迅睿CMS迁移修复测试 测试内容:这是一段中文测试内容,包含特殊符号!@¥%……& ```查看前台显示是否正常。
在MySQL中执行:
``` SELECT FROM dr_1_news ORDER BY id DESC LIMIT 1; ```确认返回的中文数据正常显示。
访问网站页面,查看响应头:
``` curl -I http://yourdomain.com ```确认Content-Type包含charset=utf-8。
今后备份数据库时使用:
``` mysqldump -u root -p --default-character-set=utf8mb4 --skip-set-charset your_database_name > backup_utf8mb4.sql ```创建部署脚本deploy.sh:
``` !/bin/bash 设置数据库字符集 mysql -u root -p -e "ALTER DATABASE ${DB_NAME} CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;" 导入数据 mysql -u root -p --default-character-set=utf8mb4 ${DB_NAME} < backup.sql 验证修复 mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set%';" ```A:可能是字段级别的字符集问题,需要单独修复:
``` ALTER TABLE dr_1_news CHANGE content content LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ```A:在导入前转换SQL文件:
``` iconv -f gbk -t utf8mb4 other_cms.sql > xunrui_ready.sql ```A:utf8mb4支持完整的Unicode字符(如emoji),迅睿CMS推荐使用utf8mb4。
按照以上步骤操作后,迅睿CMS迁移后的乱码问题应该得到完全解决。如果仍有问题,请检查每个步骤的执行结果,确保没有跳过任何验证环节。
上一篇: 迅睿CMS评论数标签调用,一篇文章讲透
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图