增加mysql默认编码

This commit is contained in:
yml
2026-06-05 21:27:26 +08:00
parent c15e5e8b6a
commit 63d4011796
4 changed files with 157 additions and 1 deletions
+2
View File
@@ -2,12 +2,14 @@ services:
mysql:
image: mysql:8.4
restart: unless-stopped
command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
env_file:
- ../backend/.env
environment:
TZ: Asia/Shanghai
volumes:
- mysql_data:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro
deploy:
resources:
limits:
+11
View File
@@ -0,0 +1,11 @@
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4'
skip-character-set-client-handshake
+142
View File
@@ -0,0 +1,142 @@
## 🔒 彻底杜绝字符编码问题的方案
本文档说明如何在整个技术栈中确保使用 UTF-8 编码,避免出现乱码问题。
### 1. MySQL 服务器配置(已完成 ✅)
**配置文件:** `deploy/mysql/my.cnf`
```ini
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4'
skip-character-set-client-handshake
```
**Docker Compose 配置:** `deploy/docker-compose.prod.yml`
```yaml
mysql:
command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
volumes:
- ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro
```
### 2. 数据库连接字符集(已完成 ✅)
**配置:** `backend/internal/config/config.go`
```go
MySQLDSN: "hfb:secret@tcp(127.0.0.1:3306)/hfb_sys?charset=utf8mb4&parseTime=True&loc=Local"
```
**关键参数:**
- `charset=utf8mb4` - 强制使用 UTF-8 编码
- `parseTime=True` - 正确解析时间类型
- `loc=Local` - 使用本地时区
### 3. 数据库表结构(已完成 ✅)
**迁移文件:** `backend/migrations/*.sql`
```sql
CREATE TABLE table_name (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
```
**转换现有表:**
```sql
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
### 4. 后端 API 响应头(建议添加)
**在 HTTP 响应中设置:**
```go
w.Header().Set("Content-Type", "application/json; charset=utf-8")
```
### 5. 前端 HTML 元信息(已完成 ✅)
**index.html**
```html
<meta charset="UTF-8">
```
### 6. 文件编辑器配置
**确保所有代码文件使用 UTF-8**
- `.editorconfig` - 统一团队编码
- IDE 设置 - 文件编码为 UTF-8
- Git 设置 - 避免行尾符问题
### 7. 验证检查清单
部署后执行以下命令验证:
```bash
# 1. 检查 MySQL 字符集配置
docker exec -i deploy-mysql-1 mysql -u hfb -p<password> -e "SHOW VARIABLES LIKE 'character%';"
# 2. 检查表字符集
docker exec -i deploy-mysql-1 mysql -u hfb -p<password> hfb_sys -e "SHOW CREATE TABLE announcements\G"
# 3. 验证数据正确性
docker exec -i deploy-mysql-1 mysql -u hfb -p<password> hfb_sys -e "SELECT id, title FROM announcements LIMIT 3;"
```
### 8. 常见问题排查
**问题:数据库中已有乱码数据**
```bash
# 执行修复脚本
docker exec -i deploy-mysql-1 mysql -u hfb -p<password> hfb_sys < backend/migrations/000008_fix_announcement_charset.sql
```
**问题:新插入的数据仍然乱码**
- 检查数据库连接 DSN 是否包含 `charset=utf8mb4`
- 检查 MySQL 配置文件是否生效
- 重启 MySQL 容器使配置生效
**问题:只有某些字段乱码**
```sql
-- 转换特定列
ALTER TABLE table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
### 9. 部署流程
每次部署时确保:
1. ✅ MySQL 配置文件已挂载
2. ✅ 环境变量 MYSQL_DSN 包含 charset 参数
3. ✅ 新建表使用正确的字符集
4. ✅ 迁移脚本指定字符集
### 10. 开发规范
**新建表时必须指定:**
```sql
CREATE TABLE new_table (
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='表注释';
```
**修改表时保持一致:**
```sql
ALTER TABLE existing_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
```
---
## 总结
通过以上配置,确保了从数据库服务器 → 连接驱动 → 表结构 → 应用层 → 前端展示的完整链路都使用 UTF-8 编码,彻底杜绝乱码问题。
+2 -1
View File
@@ -7,5 +7,6 @@
"@/*": ["./src/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"],
"exclude": ["src/**/__tests__/**", "src/**/*.spec.ts", "src/**/*.test.ts", "node_modules"]
}