表概述
mail 表是魔兽世界邮件系统的核心表,记录所有玩家之间发送的邮件信息。每条记录包含一封邮件的发送者、接收者、主题内容、正文、附件金币、COD(付款取信)金额以及过期时间等完整信息。
- 玩家间邮件通信
- 物品/金币邮寄
- 付款取信(COD)
- 过期自动清理
主键为 id,每封邮件有唯一标识。通过 idx_receiver 索引可以快速查询指定角色的所有邮件。
表结构
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| id | int UNSIGNED | 0 | 邮件ID(主键,唯一标识) |
| messageType | tinyint UNSIGNED | 0 | 邮件类型(0=普通,1=角色创建,2=拍卖,3=生物,4=游戏对象,5=物品) |
| stationery | tinyint | 41 | 信纸样式(41=默认信纸) |
| mailTemplateId | smallint UNSIGNED | 0 | 邮件模板ID |
| sender | int UNSIGNED | 0 | 发件人角色GUID |
| receiver | int UNSIGNED | 0 | 收件人角色GUID |
| subject | longtext | NULL | 邮件主题 |
| body | longtext | NULL | 邮件正文内容 |
| has_items | tinyint UNSIGNED | 0 | 是否包含附件物品(0=无,1=有) |
| expire_time | int UNSIGNED | 0 | 邮件过期时间(Unix时间戳,默认30天) |
| deliver_time | int UNSIGNED | 0 | 邮件投递时间(Unix时间戳) |
| money | int UNSIGNED | 0 | 附带的金币数量(铜币单位) |
| cod | int UNSIGNED | 0 | COD付款取信金额(铜币单位,>0表示需要付款) |
| checked | tinyint UNSIGNED | 0 | 邮件是否已读(0=未读,1=已读) |
实际案例
案例1:查询指定角色的所有收件
SELECT
m.id, m.messageType, m.subject,
m.money / 10000 AS gold,
m.cod / 10000 AS cod_gold,
m.has_items, m.checked,
FROM_UNIXTIME(m.deliver_time) AS deliver_date,
FROM_UNIXTIME(m.expire_time) AS expire_date
FROM mail m
WHERE m.receiver = 100
ORDER BY m.deliver_time DESC;案例2:查询过期未读的邮件
SELECT
m.id, c.name AS receiver_name,
m.subject, m.money, m.has_items,
FROM_UNIXTIME(m.expire_time) AS expire_date
FROM mail m
JOIN characters c ON c.guid = m.receiver
WHERE m.expire_time < UNIX_TIMESTAMP()
AND m.checked = 0
ORDER BY m.expire_time;案例3:统计系统邮件的每日发送量
SELECT
DATE(FROM_UNIXTIME(m.deliver_time)) AS date,
SUM(CASE WHEN m.messageType = 2 THEN 1 ELSE 0 END) AS auction_mail,
SUM(CASE WHEN m.messageType = 0 THEN 1 ELSE 0 END) AS player_mail
FROM mail m
WHERE m.deliver_time > UNIX_TIMESTAMP() - 30 * 86400
GROUP BY DATE(FROM_UNIXTIME(m.deliver_time))
ORDER BY date DESC;常见问题
Q1: messageType 字段的取值含义是什么?
0=普通玩家邮件,1=角色创建时的欢迎邮件,2=拍卖行发送的邮件,3=生物/NPC发送的邮件,4=游戏对象发送的邮件,5=物品触发的邮件。Q2: cod 和 money 有什么区别?
money 是直接附在邮件中的金币(收件人直接领取),cod 是"货到付款"(COD)金额,收件人需要支付该金额才能取走邮件。Q3: 邮件过期后会自动删除吗?
是的。邮件在 expire_time 到达后,服务器会自动清理该邮件。如果邮件有附件(has_items=1),过期时物品也会一并删除。