📖 characters_money 表
角色金币变动日志表,用于记录角色的金币变更历史。
📋 表概述
characters_money 表是一个日志/审计表,记录角色金币的每次变动。虽然 characters 表中有 money 字段存储当前余额,但该表提供了历史变化记录,便于追踪金币流水和异常检测。
- 主键:无显式
- 引擎:InnoDB
- 关联表:characters(通过 guid)
📊 表结构
| 字段名 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|
guid | int UNSIGNED | 0 | 角色唯一标识,关联 characters.guid |
money | int UNSIGNED | 0 | 当前铜币余额(单位:铜币) |
date | date | NULL | 记录日期 |
执行时间 | datetime | CURRENT_TIMESTAMP | 记录插入的精确时间戳 |
🔍 重要字段详解
money — 金币余额
存储角色当前的金币余额,单位为铜币。WoW 中 1 金币 = 100 银币 = 10000 铜币。例如 123456 铜币 = 12 金 34 银 56 铜。该值对应 characters.money 字段的快照。
执行时间 — 记录时间戳
这是一个中文命名的特殊字段,存储记录写入的精确 datetime 时间戳。用于追踪金币变动发生的具体时间,方便日志审计。
💡 SQL查询示例
查询某个角色最近的10条金币变动记录
SELECT guid,
CONCAT(FLOOR(money / 10000), '金 ',
FLOOR((money % 10000) / 100), '银 ',
(money % 100), '铜') AS 金币,
date, `执行时间`
FROM characters_money
WHERE guid = 12345
ORDER BY `执行时间` DESC
LIMIT 10;
统计今日金币变动总额前的10个角色
SELECT guid, MAX(money) - MIN(money) AS 变动铜币,
CONCAT(FLOOR((MAX(money) - MIN(money)) / 10000), '金') AS 变动金币
FROM characters_money
WHERE DATE(`执行时间`) = CURDATE()
GROUP BY guid
HAVING 变动铜币 > 0
ORDER BY 变动铜币 DESC
LIMIT 10;
❓ 常见问题
Q: 这个表和 characters.money 字段有什么区别?
characters.money 存储的是角色的当前实时金币余额,只有一个值。characters_money 是日志表,记录了每次余额变动的快照,可用于审计和历史查询。
Q: 为什么 money 是铜币单位?
这是 WoW 游戏内部的存储惯例。铜币是最小单位,使用整数存储避免了浮点数精度问题。显示时除以 10000 得到金币数。