解决PHP与MySQL从Latin1转UTF8后的字符集及LIKE搜索问题
从Latin1/ISO-8859-1切换到UTF-8的完整解决步骤
1. 先备份原始数据(关键前置操作)
- 导出数据库的Latin1编码原始数据,禁止用UTF-8编辑器修改备份文件:
mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > backup_latin1.sql
2. 调整数据库与表的编码规则
- 修改数据库默认编码为
utf8mb4(完整UTF-8支持,替代MySQL原生不完整的utf8):ALTER DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 批量修改现有表的编码(自动转换数据编码):
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
(多表可编写脚本批量执行)
3. 统一前端与文件编码
- 所有PHP文件保存为UTF-8无BOM格式,防止页面开头出现乱码字符。
- 更新HTML编码声明:
<meta charset="utf-8">(HTML5标准写法)
或兼容旧版本的:<meta http-equiv="content-type" content="text/html; charset=utf-8" />
4. 修正数据库连接的字符集设置
- 在PHP建立MySQL连接后,立即设置连接字符集为
utf8mb4,确保数据传输编码一致:
$mysqli = new mysqli('数据库主机', '用户名', '密码', '数据库名'); if ($mysqli->connect_error) { die('连接失败: ' . $mysqli->connect_error); } // 设置连接字符集 $mysqli->set_charset('utf8mb4');
5. 重新导入数据并验证
- 使用命令行导入备份的Latin1数据,指定导入字符集为Latin1,让MySQL自动转码到utf8mb4:
mysql -u 用户名 -p --default-character-set=latin1 数据库名 < backup_latin1.sql - 验证数据显示正常后,测试
%LIKE%搜索功能:utf8mb4_unicode_ci是不区分大小写的排序规则,能正常支持模糊搜索——之前用utf8_bin是二进制匹配,会导致搜索失效。
6. 全面验证场景
- 测试页面静态文本、数据库内容显示、新增数据的存储与读取、模糊搜索等功能是否全部正常。
- 后续开发的PHP文件统一使用UTF-8无BOM格式,避免编码问题复发。
内容的提问来源于stack exchange,提问作者user6951304
相关产品推荐
相关产品推荐

