关于 db-types-precision
用于数据库审计的 Skill,检查类型设计风险,包括货币精度、缺少时区的时间戳和被 JSON 隐藏的结构,适用于关系型与文档型数据库的 Schema 审查。
主要功能
- 01标记浮点货币列
- 02检查时间戳是否缺少时区
- 03查找 JSON 中隐藏的稳定结构
- 04检查枚举、字符集与排序规则
- 05解析 DDL 和 Schema 快照
适用场景
- 01审查货币列类型
- 02审计时间戳列
- 03检查 JSON 列中隐藏的 Schema
- 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(或 MongoDouble)表示货币/金额——二进制浮点数无法精确表示十进制分。应使用numeric/decimal/Decimal128/整数最小货币单位。这是严重性 5 的上限。 - 时间戳与时区:对跨时区的时间点使用不带时区的
timestamp/datetime;建议使用以 UTC 存储的timestamptz。标记缺少时区且名称为*_at的timestamp列。 - 用 jsonb 规避架构:
jsonb/json列承载了本应作为一等类型化/受约束列的数据(稳定、会被查询、与外键相关的键被埋在 JSON 中)。嵌入灵活的数据块没有问题,但不能借此隐藏架构。 - 枚举与查找表:在使用引用查找表会更安全、更易于演进的情况下,使用原生
ENUM(尤其是难以修改的 MySQLENUM);或者在需要受约束域时使用自由文本状态。 - 字符集/排序规则:使用 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— MySQLutf8会截断增补平面字符(严重性 3,warn)。 每项发现:evidence.observed引用列 DDL 原文;verification.reproduce是上文可运行的查询(method: ddl_parse/schema_introspect);expected_impact按区间划分并标注置信度。
诚实性
- 无论范式如何,金额使用浮点数都封顶(关系型和 Mongo
Double均如此);绝不要弱化这一判断。 - 对于真正灵活/稀疏的数据,
jsonb是合适的工具——只有当它掩盖了稳定、会被查询的关系型架构时才标记。 - 未展示声明的排序规则时,不要断言存在排序规则问题;影响应按区间划分,绝不要编造排序错误率。
评论
支持 Markdown