216 lines
4.4 KiB
Markdown
216 lines
4.4 KiB
Markdown
|
|
# 用户资料乱码完整修复方案
|
|||
|
|
|
|||
|
|
## 问题现象
|
|||
|
|
|
|||
|
|
用户个人资料页面显示乱码(<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
|