pangu-user-platform/backend/sql/fix_charset.sh

98 lines
3.0 KiB
Bash
Raw Normal View History

fix: 修复MySQL字符集问题,防止中文乱码 ## 问题描述 用户反馈:菜单comment字段可能出现乱码 ## 问题分析 ### 乱码原因 1. **MySQL连接字符集不匹配**: - 客户端未指定字符集 - 默认字符集与数据不匹配 2. **终端显示问题**: - 终端编码与数据库编码不一致 - 查询结果传输过程中字符集转换错误 ### 数据库状态检查 ```sql -- 当前配置 character_set_client = utf8mb4 ✅ character_set_connection = utf8mb4 ✅ character_set_database = utf8mb4 ✅ character_set_results = utf8mb4 ✅ -- 表字符集 sys_menu: utf8mb4_general_ci ✅ ``` ## 解决方案 ### 1. 更新import_menu.sh导入脚本 **修改**:所有mysql命令添加`--default-character-set=utf8mb4` ```bash # 修复前 ❌ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$SQL_FILE" # 修复后 ✅ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" < "$SQL_FILE" ``` ### 2. 创建字符集修复工具 **新增**:`sql/fix_charset.sh` **功能特性**: - ✅ 检查数据库字符集配置 - ✅ 检查表字符集设置 - ✅ 测试查询菜单数据 - ✅ 一键修复表字符集 - ✅ 自动备份原表数据 **使用方法**: ```bash cd sql ./fix_charset.sh ``` **修复流程**: 1. 检查当前字符集配置 2. 显示菜单数据(检测乱码) 3. 用户确认是否修复 4. 创建备份表 5. 转换表字符集为utf8mb4 6. 验证修复结果 ## 预防措施 ### 数据导入时 ```bash # 始终指定字符集 mysql --default-character-set=utf8mb4 -h... < file.sql ``` ### 数据查询时 ```bash # 查询时指定字符集 mysql --default-character-set=utf8mb4 -h... -e "SELECT ..." ``` ### 应用程序配置 ```yaml # application.yml中确保 spring: datasource: url: jdbc:mysql://...?characterEncoding=utf8mb4&useUnicode=true ``` ## 验证结果 ```sql SELECT menu_id, menu_name, remark FROM sys_menu WHERE parent_id = 0; 2000 盘古管理 盘古用户平台业务菜单 ✅ 1 系统管理 系统管理目录 ✅ 2 系统监控 系统监控目录 ✅ ``` ## 相关文件 - sql/import_menu.sh - 菜单导入脚本(已修复) - sql/fix_charset.sh - 字符集修复工具(新增) --- 作者:湖北新华业务中台研发团队
2026-02-01 13:21:43 +08:00
#!/bin/bash
# ============================================================
# 脚本名称fix_charset.sh
# 功能说明:修复数据库字符集和乱码问题
chore: 统一所有文件作者为pangu ## 修改范围 ### 受影响文件(9个) #### 1. Java文件(1个) - pangu-system/src/main/java/com/pangu/web/controller/system/SysLoginController.java - @author 湖北新华业务中台研发团队 → @author pangu #### 2. SQL脚本(5个) - sql/fix_admin_permissions.sh - 角色权限修复脚本 - sql/fix_charset.sh - 字符集修复脚本 - sql/import_menu.sh - 菜单导入脚本 - sql/fix_ruoyi_charset.sql - RuoYi乱码修复SQL - sql/sys_menu_complete.sql - 完整菜单数据SQL #### 3. SQL数据文件(3个) - sql/pangu_menu.sql - 盘古菜单数据 - sql/pangu_base_data.sql - 基础数据 - sql/pangu_school.sql - 学校数据 ### 修改内容 所有文件中的作者信息统一为: - 作者:湖北新华业务中台研发团队 → 作者:pangu - @author 湖北新华业务中台研发团队 → @author pangu ### 未修改的文件 其他文件中的作者字段已经是 `pangu` 或未设置作者,无需修改: - Java文件(80+):已经是 @author pangu ✅ - Vue文件(30+):无作者注释或已是正确格式 ✅ - JS文件(20+):无作者注释或已是正确格式 ✅ - Markdown文档:无需修改 ✅ ### 工具脚本 新增批量修改工具:`scripts/change_author_to_pangu.sh` **功能**: - 自动扫描Java、Vue、JS、SQL、Markdown文件 - 批量替换作者为pangu - 生成详细修改日志 - 支持多种作者格式(@author、作者:、Author:) **使用方法**: ```bash cd /path/to/pangu-user-platform ./scripts/change_author_to_pangu.sh ``` ### 统计信息 - ✅ 扫描文件:210个 - ✅ 修改文件:9个 - ✅ 跳过文件:201个(已是pangu或无作者) --- 作者:pangu
2026-02-01 13:27:32 +08:00
# 作 者pangu
fix: 修复MySQL字符集问题,防止中文乱码 ## 问题描述 用户反馈:菜单comment字段可能出现乱码 ## 问题分析 ### 乱码原因 1. **MySQL连接字符集不匹配**: - 客户端未指定字符集 - 默认字符集与数据不匹配 2. **终端显示问题**: - 终端编码与数据库编码不一致 - 查询结果传输过程中字符集转换错误 ### 数据库状态检查 ```sql -- 当前配置 character_set_client = utf8mb4 ✅ character_set_connection = utf8mb4 ✅ character_set_database = utf8mb4 ✅ character_set_results = utf8mb4 ✅ -- 表字符集 sys_menu: utf8mb4_general_ci ✅ ``` ## 解决方案 ### 1. 更新import_menu.sh导入脚本 **修改**:所有mysql命令添加`--default-character-set=utf8mb4` ```bash # 修复前 ❌ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" < "$SQL_FILE" # 修复后 ✅ mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" < "$SQL_FILE" ``` ### 2. 创建字符集修复工具 **新增**:`sql/fix_charset.sh` **功能特性**: - ✅ 检查数据库字符集配置 - ✅ 检查表字符集设置 - ✅ 测试查询菜单数据 - ✅ 一键修复表字符集 - ✅ 自动备份原表数据 **使用方法**: ```bash cd sql ./fix_charset.sh ``` **修复流程**: 1. 检查当前字符集配置 2. 显示菜单数据(检测乱码) 3. 用户确认是否修复 4. 创建备份表 5. 转换表字符集为utf8mb4 6. 验证修复结果 ## 预防措施 ### 数据导入时 ```bash # 始终指定字符集 mysql --default-character-set=utf8mb4 -h... < file.sql ``` ### 数据查询时 ```bash # 查询时指定字符集 mysql --default-character-set=utf8mb4 -h... -e "SELECT ..." ``` ### 应用程序配置 ```yaml # application.yml中确保 spring: datasource: url: jdbc:mysql://...?characterEncoding=utf8mb4&useUnicode=true ``` ## 验证结果 ```sql SELECT menu_id, menu_name, remark FROM sys_menu WHERE parent_id = 0; 2000 盘古管理 盘古用户平台业务菜单 ✅ 1 系统管理 系统管理目录 ✅ 2 系统监控 系统监控目录 ✅ ``` ## 相关文件 - sql/import_menu.sh - 菜单导入脚本(已修复) - sql/fix_charset.sh - 字符集修复工具(新增) --- 作者:湖北新华业务中台研发团队
2026-02-01 13:21:43 +08:00
# 创建时间2026-01-31
# 使用方法:./fix_charset.sh
# ============================================================
set -e
# 数据库配置
DB_HOST="8.148.25.55"
DB_PORT="3306"
DB_USER="root"
DB_PASS="aly2024A"
DB_NAME="pguser-db"
echo "============================================================"
echo "数据库字符集检查与修复工具"
echo "============================================================"
echo ""
# 1. 检查数据库字符集
echo "1. 检查数据库字符集配置..."
mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 -e "
SHOW VARIABLES LIKE 'character_set%';
" 2>&1 | grep -v "Warning"
echo ""
# 2. 检查sys_menu表字符集
echo "2. 检查sys_menu表字符集..."
mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" -e "
SELECT
TABLE_NAME,
TABLE_COLLATION,
COLUMN_NAME,
COLUMN_TYPE,
CHARACTER_SET_NAME,
COLLATION_NAME
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = '$DB_NAME'
AND TABLE_NAME = 'sys_menu'
AND COLUMN_NAME IN ('menu_name', 'remark');
" 2>&1 | grep -v "Warning"
echo ""
# 3. 测试查询菜单数据
echo "3. 测试查询菜单数据(检查是否有乱码)..."
mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" -e "
SELECT menu_id, menu_name, remark
FROM sys_menu
WHERE parent_id = 0
ORDER BY order_num;
" 2>&1 | grep -v "Warning"
echo ""
echo "4. 如果上面显示有乱码,是否修复表字符集?(y/n): "
read -p "" confirm
if [ "$confirm" = "y" ] || [ "$confirm" = "Y" ]; then
echo ""
echo "正在修复sys_menu表字符集..."
# 备份表
echo " - 创建备份表..."
mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" -e "
CREATE TABLE IF NOT EXISTS sys_menu_backup_charset AS SELECT * FROM sys_menu;
" 2>&1 | grep -v "Warning"
# 转换表字符集
echo " - 转换表字符集为utf8mb4..."
mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" -e "
ALTER TABLE sys_menu CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
" 2>&1 | grep -v "Warning"
echo ""
echo "✅ 字符集修复完成!"
echo ""
echo "验证修复结果:"
mysql -h"$DB_HOST" -P"$DB_PORT" -u"$DB_USER" -p"$DB_PASS" --default-character-set=utf8mb4 "$DB_NAME" -e "
SELECT menu_id, menu_name, remark
FROM sys_menu
WHERE parent_id = 0
ORDER BY order_num;
" 2>&1 | grep -v "Warning"
else
echo ""
echo "❌ 操作已取消"
fi
echo ""
echo "============================================================"
echo "检查完成!"
echo "============================================================"