MySQL数据库不支持常见拉丁字符,存储读取乱码问题求助
解决MySQL拉丁字符(é、ã等)乱码问题
核心问题分析
你遇到的是全链路编码不统一导致的乱码:数据写入时因编码转换错误被污染,读取时又无法正确解析。仅修改字段的排序规则(如utf8mb4_unicode_520_ci)没用,因为排序规则不影响字符的存储编码,关键是要确保从数据库、PHP连接到前端页面的所有环节编码一致为utf8mb4。
分步解决方法
1. 统一数据库、表、字段的字符集
确保数据库、目标表、nome字段的字符集均为utf8mb4:
- 查看数据库字符集:
SHOW CREATE DATABASE your_database_name; - 查看表字符集:
SHOW CREATE TABLE your_table_name; - 查看字段字符集:
SHOW FULL COLUMNS FROM your_table_name LIKE 'nome';
若任意环节不是utf8mb4,执行以下修改:
- 修改数据库:
ALTER DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 修改表:
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 修改字段(表修改未生效时单独执行):
ALTER TABLE your_table_name MODIFY COLUMN nome VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 强制PHP数据库连接使用utf8mb4
这是最容易忽略的关键步骤:PHP连接MySQL时必须显式指定编码,否则会用默认编码(如latin1)写入数据,直接导致乱码。
- mysqli方式:
$conn = mysqli_connect('localhost', 'user', 'password', 'your_db'); mysqli_set_charset($conn, 'utf8mb4'); // 必须添加此句 - PDO方式:
$pdo = new PDO( 'mysql:host=localhost;dbname=your_db;charset=utf8mb4', // 连接字符串中指定charset 'user', 'password' );
3. 确保前端页面编码统一
- HTML页面头部添加编码声明:
<meta charset="UTF-8"> - PHP输出前设置响应头(可选,避免部分环境兼容问题):
header('Content-Type: text/html; charset=utf-8');
4. 修复已存储的乱码数据
之前错误存储的Joã£o属于编码二次转换导致的乱码,先备份数据,再尝试修复:
UPDATE your_table_name SET nome = CONVERT(CONVERT(nome USING latin1) USING utf8mb4);
若此语句无效,可尝试将数据导出为latin1编码,再以utf8mb4编码重新导入。
内容的提问来源于stack exchange,提问作者Isalanctos
相关产品推荐
相关产品推荐

