You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:55:17