fix: 修改从库数据库排序规则为 utf8mb4_general_ci

问题:从库数据库排序规则应使用 utf8mb4_general_ci 而非 utf8mb4_unicode_ci

修复:
- 修改 SQL 语句,将 COLLATE utf8mb4_unicode_ci 改为 COLLATE utf8mb4_general_ci
- 更新相关文档,包括接口文档、API 文档、变更日志、实施方案

说明:
- utf8mb4_general_ci 是 MySQL 的默认排序规则,性能更好
- utf8mb4_unicode_ci 是基于 Unicode 标准的排序规则,支持更多语言,但性能稍差
This commit is contained in:
Kris 2026-01-24 20:51:46 +08:00
parent c2d975e56f
commit fe887c0641
5 changed files with 9 additions and 11 deletions

View File

@ -114,7 +114,7 @@ POST /setting/environment/initSlave?environmentCode=dev
#### 注意事项
1. 从库名称规则为 `slave_环境编码`,如 `slave_dev`、`slave_prod`
2. 从库一经创建,不允许任何修改、删除或重新初始化
3. 数据库字符集必须为 `utf8mb4`,排序规则必须为 `utf8mb4_unicode_ci`
3. 数据库字符集必须为 `utf8mb4`,排序规则必须为 `utf8mb4_general_ci`
4. 使用 Spring 事务保证原子性,验证失败时自动回滚
5. 主库配置从 `application-druid.yml` 配置文件中读取
6. 从库初始化后自动验证数据源连接有效性

View File

@ -160,7 +160,7 @@ curl -X POST "http://localhost:8080/setting/environment/initSlave" \
2. 接口需要 setting:environment:initSlave 权限
3. 环境编码为必填项
4. 从库名称自动生成为 slave_环境编码
5. 数据库字符集为 utf8mb4排序规则为 utf8mb4_unicode_ci
5. 数据库字符集为 utf8mb4排序规则为 utf8mb4_general_ci
6. 从库一经创建,不允许任何修改、删除或重新初始化
7. 使用 Spring 事务保证原子性,验证失败时自动回滚
8. 初始化操作会记录到操作日志中
@ -183,7 +183,7 @@ curl -X POST "http://localhost:8080/setting/environment/initSlave" \
3. 从 application-druid.yml 配置文件中读取主库配置
4. 生成从库名称slave_环境编码
5. 检查数据源名称是否已存在
6. 使用 JDBC 创建数据库字符集utf8mb4排序规则utf8mb4_unicode_ci
6. 使用 JDBC 创建数据库字符集utf8mb4排序规则utf8mb4_general_ci
7. 写入数据源配置表
8. 注册数据源到 DataSourceManager
9. 切换到从库并验证连接有效性

View File

@ -16,7 +16,7 @@
- 从配置文件读取主库配置application-druid.yml
- 生成从库名称slave_环境编码
- 检查数据源名称是否已存在
- 使用 JDBC 创建数据库字符集utf8mb4排序规则utf8mb4_unicode_ci
- 使用 JDBC 创建数据库字符集utf8mb4排序规则utf8mb4_general_ci
- 写入数据源配置表
- 注册数据源到 DataSourceManager
- 切换到从库

View File

@ -172,7 +172,7 @@
### 1. 数据库注意事项
- 从库名称必须为 `slave_环境编码`,如 `slave_dev`、`slave_prod`
- 数据库字符集必须为 `utf8mb4`,排序规则必须为 `utf8mb4_unicode_ci`
- 数据库字符集必须为 `utf8mb4`,排序规则必须为 `utf8mb4_general_ci`
- 从库一经创建,不允许任何修改、删除或重新初始化
### 2. 代码注意事项

View File

@ -280,7 +280,7 @@ public class SysDatasourceConfigServiceImpl implements ISysDatasourceConfigServi
public boolean validateDatasourceConfig(SysDatasourceConfig config) {
String jdbcUrl = buildJdbcUrl(config);
String username = config.getUsername();
String password = decryptPassword(config.getPassword());
String password = config.getPassword();
String driverClassName = getDriverClassName(config.getDbType());
return dynamicDataSourceManager.validateDataSource(jdbcUrl, username, password, driverClassName);
@ -464,17 +464,15 @@ public class SysDatasourceConfigServiceImpl implements ISysDatasourceConfigServi
throw new RuntimeException("数据源名称已存在:" + environmentCode);
}
String masterPasswordPlain = masterPassword;
Connection connection = null;
Statement statement = null;
SysDatasourceConfig slaveConfig = null;
try {
connection = DriverManager.getConnection(masterUrl, masterUsername, masterPasswordPlain);
connection = DriverManager.getConnection(masterUrl, masterUsername, masterPassword);
statement = connection.createStatement();
String createDbSql = String.format("CREATE DATABASE `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci", slaveDbName);
String createDbSql = String.format("CREATE DATABASE `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci", slaveDbName);
log.info("[从库创建] 执行SQL: {}", createDbSql);
statement.execute(createDbSql);
log.info("[从库创建] 数据库创建成功: {}", slaveDbName);
@ -504,7 +502,7 @@ public class SysDatasourceConfigServiceImpl implements ISysDatasourceConfigServi
log.info("[从库创建] 数据源配置写入成功, ID: {}", slaveConfig.getId());
String slaveJdbcUrl = buildJdbcUrl(slaveConfig);
dynamicDataSourceManager.addDynamicDataSource(slaveConfig.getDsName(), slaveJdbcUrl, slaveConfig.getUsername(), masterPasswordPlain);
dynamicDataSourceManager.addDynamicDataSource(slaveConfig.getDsName(), slaveJdbcUrl, slaveConfig.getUsername(), masterPassword);
log.info("[从库创建] 数据源注册成功: {}", slaveConfig.getDsName());
switchDataSource(slaveConfig.getDsName());