mcpField
D
db-types-precision

db-types-precision

github.com/hainrixz数据与数据库2170 次安装4 天前更新
代码仓库

关于 db-types-precision

用于数据库审计的 Skill,检查类型设计风险,包括货币精度、缺少时区的时间戳和被 JSON 隐藏的结构,适用于关系型与文档型数据库的 Schema 审查。

主要功能

  1. 01标记浮点货币列
  2. 02检查时间戳是否缺少时区
  3. 03查找 JSON 中隐藏的稳定结构
  4. 04检查枚举、字符集与排序规则
  5. 05解析 DDL 和 Schema 快照

适用场景

  1. 01审查货币列类型
  2. 02审计时间戳列
  3. 03检查 JSON 列中隐藏的 Schema
  4. 04检查 MySQL 字符集与排序规则

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hainrixz/claude-db --skill db-types-precision

安装后在 Claude Code 中输入/db-types-precision确认已加载。

详细介绍

db-types-precision (M4)

类型是最先应用、成本最低的约束:它决定哪些值能够表示,以及它们如何排序、比较和舍入。经典的数据丢失错误——用浮点数存储金额——就发生在这里。本模块属于设计轴(Tipos 类别,与 M6 共用)。它适用于各种范式,并使用符合相应范式的类型词汇(Postgres numeric、Mongo Decimal128)。

检查内容

  • 金额使用浮点数:使用 float/real/double precision(或 Mongo Double)表示货币/金额——二进制浮点数无法精确表示十进制分。应使用 numeric/decimal/Decimal128/整数最小货币单位。这是严重性 5 的上限。
  • 时间戳与时区:对跨时区的时间点使用不带时区的 timestamp/datetime;建议使用以 UTC 存储的 timestamptz。标记缺少时区且名称为 *_at 的 timestamp 列。
  • 用 jsonb 规避架构:jsonb/json 列承载了本应作为一等类型化/受约束列的数据(稳定、会被查询、与外键相关的键被埋在 JSON 中)。嵌入灵活的数据块没有问题,但不能借此隐藏架构。
  • 枚举与查找表:在使用引用查找表会更安全、更易于演进的情况下,使用原生 ENUM(尤其是难以修改的 MySQL ENUM);或者在需要受约束域时使用自由文本状态。
  • 字符集/排序规则:使用 MySQL utf8(3 字节,不支持 emoji/增补平面字符)而非 utf8mb4;标识符/电子邮件使用了非预期的区分大小写或重音符号的排序规则。

轴与严重性

  • 金额使用 float/double:严重性 5,fail,轴 design,置信度 established(封顶 Design 分数)。
  • 跨时区时间点使用不带时区的时间戳:严重性 3–4,warn,轴 design。
  • jsonb 隐藏稳定且会被查询的架构:严重性 3,warn,fixable: proposed。
  • MySQL utf8(而非 utf8mb4):严重性 3,warn。
  • 枚举导致锁定/排序规则错误:严重性 2–3,warn。

Tier-0 静态检查

通过 scripts/parse-schema.mjs 解析 DDL/快照:将类似金额的列名(price, amount, total, balance, cost, *_cents)与 float|real|double|Double 类型匹配;标记 *_at 列中不带时区的 timestamp/datetime;检测 json/jsonb 列和 ENUM(...);读取声明的字符集/排序规则。方向性的程序源代码解析绝不会触发金额浮点数严重性 5 的上限。

Tier-1 验证查询

从目录中确认浮点金额列:

-- $DATABASE_URL, read-only
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE data_type IN ('real','double precision')
  AND column_name ~* '(price|amount|total|balance|cost|fee|tax)';

MySQL 字符集检查:

SELECT table_name, column_name, character_set_name, collation_name
FROM information_schema.columns WHERE character_set_name = 'utf8';

发现项

按 schema/finding.schema.json 输出。示例:

  • M4.orders.total_float_money — total double precision 会导致分值丢失(严重性 5,fail,轴 design,置信度 established)。
  • M4.events.created_at_naive_timestamp — created_at timestamp 不带时区(严重性 4,warn,轴 design,fixable: proposed)。
  • M4.products.attributes_jsonb_schema_evasion — 稳定且会被查询的键被埋在 jsonb 中(严重性 3,warn)。
  • M4.users.email_utf8_not_utf8mb4 — MySQL utf8 会截断增补平面字符(严重性 3,warn)。 每项发现:evidence.observed 引用列 DDL 原文;verification.reproduce 是上文可运行的查询(method: ddl_parse / schema_introspect);expected_impact 按区间划分并标注置信度。

诚实性

  • 无论范式如何,金额使用浮点数都封顶(关系型和 Mongo Double 均如此);绝不要弱化这一判断。
  • 对于真正灵活/稀疏的数据,jsonb 是合适的工具——只有当它掩盖了稳定、会被查询的关系型架构时才标记。
  • 未展示声明的排序规则时,不要断言存在排序规则问题;影响应按区间划分,绝不要编造排序错误率。

评论

支持 Markdown