docs(GOV-005): 明确 MySQL 5.7 兼容性设计
This commit is contained in:
@@ -0,0 +1,80 @@
|
|||||||
|
# MySQL 5.7 字符集与兼容性基线设计规格
|
||||||
|
|
||||||
|
- 功能编号:GOV-005
|
||||||
|
- 规格版本:0.1
|
||||||
|
- 状态:approved_for_review
|
||||||
|
- 日期:2026-08-13
|
||||||
|
|
||||||
|
## 背景与目标
|
||||||
|
|
||||||
|
系统架构和开发规范已经选择 MySQL,但尚未固定服务端版本、字符集和排序规则。不同开发环境如果分别使用 MySQL 5.7、8.x 或不同排序规则,会造成迁移语法、索引行为、字符串比较和排序结果不一致。
|
||||||
|
|
||||||
|
本功能建立项目级数据库兼容性基线:所有正式实现固定使用 MySQL 5.7.x,字符集固定为 `utf8mb4`,排序规则固定为 `utf8mb4_general_ci`。虽然市场概览第一阶段只定义持久化接口、不启用 MySQL,该约束仍从数据模型设计开始生效。
|
||||||
|
|
||||||
|
## 约束方案
|
||||||
|
|
||||||
|
### 采用方案:全链路显式声明
|
||||||
|
|
||||||
|
数据库实例/Schema、连接会话、迁移脚本、表、需要覆盖默认值的文本列,以及 Docker、测试和 CI 环境都显式声明或验证版本和字符集规则。
|
||||||
|
|
||||||
|
采用原因:只设置服务器默认值无法防止迁移脚本、ORM 连接或外部工具创建出不同排序规则的对象。全链路显式声明能够在代码审查和自动测试中直接验证。
|
||||||
|
|
||||||
|
### 不采用:仅依赖服务器默认值
|
||||||
|
|
||||||
|
部署配置简单,但开发机、测试环境或后续迁移工具可能使用不同默认值,无法保证可复现,不采用。
|
||||||
|
|
||||||
|
### 不采用:允许 MySQL 8.x 向下兼容
|
||||||
|
|
||||||
|
在 8.x 开发、声称兼容 5.7,容易无意引入 CTE、窗口函数、函数索引和 8.x 行为差异。项目明确要求不使用 8.x,因此不采用。
|
||||||
|
|
||||||
|
## 技术基线
|
||||||
|
|
||||||
|
- 数据库服务端:MySQL `5.7.x`,部署镜像和测试环境必须固定到明确的 5.7 补丁版本;禁止 `latest`、`8` 或 `8.x`。
|
||||||
|
- 默认字符集:`utf8mb4`。
|
||||||
|
- 默认排序规则:`utf8mb4_general_ci`。
|
||||||
|
- 数据库创建语句必须包含 `DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci`。
|
||||||
|
- 表创建或迁移必须显式保持 `DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci`。
|
||||||
|
- ORM/数据库驱动连接配置必须设置 `charset=utf8mb4`,连接建立后验证会话排序规则为 `utf8mb4_general_ci`,不能假设服务器默认值正确。
|
||||||
|
- 文本列原则上继承表级规则;只有确实需要不同比较语义时才允许列级覆盖,并必须另建 ADR 获得批准。
|
||||||
|
|
||||||
|
## MySQL 5.7 兼容边界
|
||||||
|
|
||||||
|
代码、查询、迁移和测试不得使用仅在 MySQL 8.x 可用或行为不同的能力,包括但不限于:
|
||||||
|
|
||||||
|
- 公用表表达式 `WITH` 和递归 CTE。
|
||||||
|
- 窗口函数,例如 `ROW_NUMBER()`、`RANK()` 和 `OVER (...)`。
|
||||||
|
- 函数索引和不可见索引。
|
||||||
|
- `CHECK` 约束在 8.x 的强制执行语义;5.7 中业务约束必须由应用校验、普通索引或可验证的数据写入逻辑保证。
|
||||||
|
- `utf8mb4_0900_*` 排序规则。
|
||||||
|
- 依赖 MySQL 8.x 默认认证插件、保留字、数据字典或 JSON 增强能力的实现。
|
||||||
|
|
||||||
|
JSON 字段只有在需求能够由 MySQL 5.7 原生 JSON 能力稳定完成时才能使用;查询和索引设计必须有 5.7 实际测试证据。
|
||||||
|
|
||||||
|
## 排序规则语义
|
||||||
|
|
||||||
|
`utf8mb4_general_ci` 为不区分大小写的通用排序规则。业务代码不得把数据库字符串比较误认为大小写敏感;证券代码、外部事件 ID、幂等键等需要严格身份语义的字段,应通过规范化输入、二进制字段/排序规则或明确的唯一键设计解决,并在具体功能设计中说明。
|
||||||
|
|
||||||
|
索引长度必须按 MySQL 5.7、`utf8mb4` 最多四字节字符进行预算。迁移设计不得假设 MySQL 8.x 的默认索引能力;超长文本标识应使用长度受控字段、前缀索引或稳定摘要,并提供碰撞与唯一性处理说明。
|
||||||
|
|
||||||
|
## 配置落点
|
||||||
|
|
||||||
|
- `docs/architecture/system-architecture.md`:记录数据库技术基线、第一阶段接口边界和未来启用条件。
|
||||||
|
- `docs/governance/code-development-standards.md`:把版本、字符集、排序规则、禁用能力、迁移和 Review 检查设为强制规范。
|
||||||
|
- 后续 `deploy/`:MySQL 镜像固定 5.7 补丁版本,初始化参数显式声明字符集和排序规则。
|
||||||
|
- 后续 `server/`:ORM 与连接配置、迁移、Repository 实现按本规格验证。
|
||||||
|
- 后续测试:连接真实 MySQL 5.7 检查 `SELECT VERSION()`、数据库/表排序规则和查询兼容性。
|
||||||
|
|
||||||
|
## 实施范围
|
||||||
|
|
||||||
|
本功能只更新架构、开发规范、版本记录和 GOV-005 追溯档案,不创建数据库、不启动容器、不引入 ORM,也不启用市场概览的 MySQL Repository。正式部署配置和代码实现由后续业务功能按照本基线完成。
|
||||||
|
|
||||||
|
## 验收标准
|
||||||
|
|
||||||
|
- 系统架构明确 MySQL 5.7.x、`utf8mb4` 和 `utf8mb4_general_ci`。
|
||||||
|
- 开发规范明确数据库、表、连接、迁移、测试和 Review 的全链路要求。
|
||||||
|
- 开发规范明确禁止依赖 MySQL 8.x 专属能力和 `utf8mb4_0900_*` 排序规则。
|
||||||
|
- 文档说明 `utf8mb4_general_ci` 不区分大小写及对身份字段、唯一键和索引长度的影响。
|
||||||
|
- 市场概览第一阶段仍只定义 MySQL Repository 接口,不实际启用数据库。
|
||||||
|
- GOV-005 具备 PRD、需求、设计、实施计划、测试、GitNexus 前后对比、双 Review、发布和回退档案。
|
||||||
|
- 治理测试、文档一致性检查、敏感信息检查和 GitNexus 变更检测通过。
|
||||||
|
- 中文提交和 `v0.0.4` 标签均精确推送到 Gitea。
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# GitNexus 开发前基线
|
||||||
|
|
||||||
|
- 功能编号:GOV-005
|
||||||
|
- 记录时间:2026年8月13日 GMT+8 09:45:51
|
||||||
|
- 分支:main
|
||||||
|
- 基线提交:6aa9fed62158
|
||||||
|
|
||||||
|
## 工作区
|
||||||
|
|
||||||
|
```text
|
||||||
|
(干净)
|
||||||
|
```
|
||||||
|
|
||||||
|
## GitNexus 状态
|
||||||
|
|
||||||
|
```text
|
||||||
|
Repository: /Users/citrons/Documents/Codex/2026-08-12/wo-x/a-share-analysis
|
||||||
|
Indexed: 8/12/2026, 6:45:56 PM
|
||||||
|
Indexed commit: 6aa9fed
|
||||||
|
Current commit: 6aa9fed
|
||||||
|
Status: ✅ up-to-date
|
||||||
|
```
|
||||||
|
|
||||||
|
## 后续人工分析
|
||||||
|
|
||||||
|
在修改代码前,将 GitNexus query、context、impact 的结论写入 `gitnexus/impact-plan.md`。高风险结果必须先获得用户确认。
|
||||||
Reference in New Issue
Block a user