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

216 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 用户资料乱码完整修复方案
## 问题现象
用户个人资料页面显示乱码<EFBFBD>包括
- 用户名
- 真实姓名
- 其他中文字段
## 根本原因
**数据库中存储的数据本身就是乱码**,不是前端显示问题。
可能的原因:
1. 数据库字符集不是 UTF-8
2. 表字符集不是 UTF-8
3. 插入数据时使用了错误的字符编码
4. 数据导入时编码转换错误
## 完整修复步骤
### 步骤1检查数据库字符集
```sql
-- 执行这个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检查用户数据
```sql
-- 查看用户数据
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修复数据库字符集
```sql
-- 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如果知道原始数据**
```sql
-- 手动更新正确的数据
UPDATE user SET real_name = '张小明' WHERE id = 1;
UPDATE user SET real_name = '李四' WHERE id = 2;
```
**方案B如果有备份数据**
从备份中恢复正确的数据。
**方案C如果数据无法恢复**
让用户重新填写个人资料。
### 步骤5验证修复
```sql
-- 查看修复后的数据
SELECT id, username, real_name, phone, role
FROM user
WHERE id IN (1, 2);
```
### 步骤6重启后端
修改数据库后,重启后端服务:
```bash
cd peidu/backend
# 停止当前服务Ctrl+C
mvn spring-boot:run
```
### 步骤7测试前端
1. 刷新小程序
2. 进入个人资料页面
3. 检查中文是否正常显示
## 快速修复脚本
如果你知道用户的正确姓名,可以直接执行:
```sql
-- 修复用户 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
在创建数据库时:
```sql
CREATE DATABASE peidu
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
```
### 2. 确保表使用 UTF-8
在创建表时:
```sql
CREATE TABLE user (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
### 3. 确保连接使用 UTF-8
`application.yml` 中:
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/peidu?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
```
### 4. 确保前端使用 UTF-8
在前端代码中:
```javascript
// 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