Files
a-share-analysis/docs/features/GOV-005-mysql57-charset-baseline/design.md

5.2 KiB

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。