peixue-dev/Archive/[一次性]用户资料乱码完整修复方案-2026-01-28.md

4.4 KiB
Raw Blame History

用户资料乱码完整修复方案

问题现象

用户个人资料页面显示乱码<EFBFBD>包括

  • 用户名
  • 真实姓名
  • 其他中文字段

根本原因

数据库中存储的数据本身就是乱码,不是前端显示问题。

可能的原因:

  1. 数据库字符集不是 UTF-8
  2. 表字符集不是 UTF-8
  3. 插入数据时使用了错误的字符编码
  4. 数据导入时编码转换错误

完整修复步骤

步骤1检查数据库字符集

-- 执行这个SQL查看当前字符集
SELECT 
    SCHEMA_NAME,
    DEFAULT_CHARACTER_SET_NAME,
    DEFAULT_COLLATION_NAME
FROM information_schema.SCHEMATA
WHERE SCHEMA_NAME = 'peidu';

-- 查看 user 表的字符集
SHOW CREATE TABLE user;

步骤2检查用户数据

-- 查看用户数据
SELECT 
    id,
    username,
    real_name,
    HEX(real_name) as real_name_hex,
    phone,
    role
FROM user
WHERE id IN (1, 2);

如果 real_name_hex 显示的是类似 EFBFBD 的值,说明数据已经损坏。

步骤3修复数据库字符集

-- 1. 备份数据
CREATE TABLE user_backup_20260128 AS SELECT * FROM user;

-- 2. 修改数据库字符集
ALTER DATABASE peidu CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- 3. 修改表字符集
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

步骤4修复乱码数据

方案A如果知道原始数据

-- 手动更新正确的数据
UPDATE user SET real_name = '张小明' WHERE id = 1;
UPDATE user SET real_name = '李四' WHERE id = 2;

方案B如果有备份数据

从备份中恢复正确的数据。

方案C如果数据无法恢复

让用户重新填写个人资料。

步骤5验证修复

-- 查看修复后的数据
SELECT id, username, real_name, phone, role 
FROM user 
WHERE id IN (1, 2);

步骤6重启后端

修改数据库后,重启后端服务:

cd peidu/backend
# 停止当前服务Ctrl+C
mvn spring-boot:run

步骤7测试前端

  1. 刷新小程序
  2. 进入个人资料页面
  3. 检查中文是否正常显示

快速修复脚本

如果你知道用户的正确姓名,可以直接执行:

-- 修复用户 ID=1 的数据(张小明)
UPDATE user SET 
    real_name = '张小明',
    update_time = NOW()
WHERE id = 1;

-- 修复用户 ID=2 的数据(请替换为实际姓名)
UPDATE user SET 
    real_name = '实际姓名',
    update_time = NOW()
WHERE id = 2;

-- 验证
SELECT id, username, real_name, phone FROM user WHERE id IN (1, 2);

预防措施

1. 确保数据库使用 UTF-8

在创建数据库时:

CREATE DATABASE peidu 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

2. 确保表使用 UTF-8

在创建表时:

CREATE TABLE user (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3. 确保连接使用 UTF-8

application.yml 中:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/peidu?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai

4. 确保前端使用 UTF-8

在前端代码中:

// request.js
headers: {
  'Content-Type': 'application/json;charset=UTF-8'
}

故障排查

问题1修改字符集后仍然乱码

原因:数据已经损坏,修改字符集不会自动修复已损坏的数据

解决:手动更新数据或从备份恢复

问题2新插入的数据正常旧数据乱码

原因:旧数据在错误的字符集下插入

解决:只修复旧数据,新数据会自动正常

问题3数据库显示正常前端显示乱码

原因:前端编码问题

解决:检查前端请求头和响应头的字符编码

执行清单

  • 检查数据库字符集
  • 检查表字符集
  • 检查用户数据(查看是否乱码)
  • 备份数据
  • 修改数据库字符集为 utf8mb4
  • 修改表字符集为 utf8mb4
  • 手动修复乱码数据
  • 验证数据是否正确
  • 重启后端服务
  • 测试前端显示

需要你提供的信息

  1. 用户ID=1的真实姓名是什么(从截图看是"张小明"
  2. 用户ID=2的真实姓名是什么
  3. 是否有数据库备份?

提供这些信息后我可以生成准确的修复SQL脚本。

📅 创建时间

2026-01-28

👤 创建人员

Kiro AI Assistant