📖 characters 角色表完全指南
基于 AzerothCore 官方数据库 · Characters 库核心表 · 75个字段完整解析
📋 什么是 characters 表?
characters 表是 Characters 数据库中最核心的表,存储了每个玩家角色的全部基础信息,是服务器运行时读写最频繁的表。
guid(全局唯一ID),关联 account 表确定所属账号。这张表记录了角色的位置、外观、属性、金币、天赋、荣誉等所有持久化数据。🆔 身份信息
guid, account, name, race, class, gender, level, xp
📍 位置坐标
position_x/y/z, map, zone, orientation, instance_id
🎨 外观数据
skin, face, hairStyle, hairColor, facialStyle
💰 经济系统
money, bankSlots, totalTokenAmount
⚔️ 战斗属性
health, power1~7, drunk, restState, rest_bonus
🏆 PvP/荣誉
arenaPoints, totalHonorPoints, totalKills, todayKills
⏱️ 时间与数据
totaltime, leveltime, logout_time, creation_date
🛠️ 配置与标记
playerFlags, at_login, extra_flags, talentGroupsCount
📊 表结构
| 字段名 | 数据类型 | 默认值 | 说明 |
|---|---|---|---|
| guid | INT UNSIGNED | 0 | 角色全局唯一ID(主键) |
| account | INT UNSIGNED | 0 | 所属账号ID → account.id |
| name | VARCHAR(12) | NOT NULL | 角色名称(最多12字符,utf8mb4_bin) |
| race | TINYINT UNSIGNED | 0 | 种族ID(1=人类 2=兽人 3=矮人…) |
| class | TINYINT UNSIGNED | 0 | 职业ID(1=战士 2=圣骑 3=猎人…) |
| gender | TINYINT UNSIGNED | 0 | 性别(0=男 1=女) |
| level | TINYINT UNSIGNED | 0 | 角色等级(1-80) |
| xp | INT UNSIGNED | 0 | 当前等级经验值 |
| money | INT UNSIGNED | 0 | 金币(单位:铜币,10000=1金) |
| skin | TINYINT UNSIGNED | 0 | 肤色ID |
| face | TINYINT UNSIGNED | 0 | 脸型ID |
| hairStyle | TINYINT UNSIGNED | 0 | 发型ID |
| hairColor | TINYINT UNSIGNED | 0 | 发色ID |
| facialStyle | TINYINT UNSIGNED | 0 | 面部特征ID(胡须/耳环等) |
| bankSlots | TINYINT UNSIGNED | 0 | 已购买的银行背包格数 |
| restState | TINYINT UNSIGNED | 0 | 休息状态(0=正常 1=旅店休息中 2=主城休息中) |
| playerFlags | INT UNSIGNED | 0 | 玩家标记(4=GM标记 8=AFK 16=DND 64=PlayedLongTime 256=PVP启用) |
| position_x | FLOAT | 0 | 当前位置X坐标 |
| position_y | FLOAT | 0 | 当前位置Y坐标 |
| position_z | FLOAT | 0 | 当前位置Z坐标 |
| map | SMALLINT UNSIGNED | 0 | 所在地图ID(0=东部王国 1=卡利姆多 571=诺森德) |
| instance_id | INT UNSIGNED | 0 | 副本实例ID(0=不在副本中) |
| instance_mode_mask | TINYINT UNSIGNED | 0 | 副本难度掩码 |
| orientation | FLOAT | 0 | 朝向角度(0-2π) |
| taximask | TEXT | NOT NULL | 已解锁飞行点掩码(二进制位图) |
| online | TINYINT UNSIGNED | 0 | 在线状态(0=离线 1=在线) |
| cinematic | TINYINT UNSIGNED | 0 | 已观看的开场动画标志 |
| totaltime | INT UNSIGNED | 0 | 角色总游戏时间(秒) |
| leveltime | INT UNSIGNED | 0 | 当前等级游戏时间(秒) |
| logout_time | INT UNSIGNED | 0 | 上次登出时间(Unix时间戳) |
| is_logout_resting | TINYINT UNSIGNED | 0 | 登出时是否在休息区(0=否 1=是) |
| rest_bonus | FLOAT | 0 | 双倍经验休息值(最多1.5级经验量) |
| resettalents_cost | INT UNSIGNED | 0 | 下次洗天赋的费用(铜币) |
| resettalents_time | INT UNSIGNED | 0 | 上次洗天赋的时间戳 |
| trans_x | FLOAT | 0 | 交通工具上相对X坐标 |
| trans_y | FLOAT | 0 | 交通工具上相对Y坐标 |
| trans_z | FLOAT | 0 | 交通工具上相对Z坐标 |
| trans_o | FLOAT | 0 | 交通工具上朝向 |
| transguid | INT | 0 | 交通工具GUID(0=不在交通工具上) |
| extra_flags | SMALLINT UNSIGNED | 0 | 额外标记(GM相关) |
| stable_slots | TINYINT UNSIGNED | 0 | 已购买的兽栏格数 |
| at_login | SMALLINT UNSIGNED | 0 | 登录时需要执行的标记(1=重置法术 2=重置天赋 4=重置宠物天赋 8=经典↔TBC传送等) |
| zone | SMALLINT UNSIGNED | 0 | 当前所在区域ID |
| death_expire_time | INT UNSIGNED | 0 | 死亡释放时间戳(0=未死亡) |
| taxi_path | TEXT | NULL | 当前飞行路径数据 |
| arenaPoints | INT UNSIGNED | 0 | 竞技场点数 |
| totalHonorPoints | INT UNSIGNED | 0 | 总荣誉点数 |
| todayHonorPoints | INT UNSIGNED | 0 | 今日获得荣誉点数 |
| yesterdayHonorPoints | INT UNSIGNED | 0 | 昨日获得荣誉点数 |
| totalKills | INT UNSIGNED | 0 | 总荣誉击杀数 |
| todayKills | SMALLINT UNSIGNED | 0 | 今日荣誉击杀数 |
| yesterdayKills | SMALLINT UNSIGNED | 0 | 昨日荣誉击杀数 |
| chosenTitle | INT UNSIGNED | 0 | 当前使用的头衔ID |
| knownCurrencies | BIGINT UNSIGNED | 0 | 已知的货币类型掩码 |
| watchedFaction | INT UNSIGNED | 0 | 正在监控的声望阵营ID |
| drunk | TINYINT UNSIGNED | 0 | 醉酒值(0-100,越高越醉) |
| health | INT UNSIGNED | 0 | 当前生命值 |
| power1 | INT UNSIGNED | 0 | 当前资源1(法力/怒气/能量/符文能量,按职业不同) |
| power2 | INT UNSIGNED | 0 | 当前资源2(仇恨值,用于战士) |
| power3 | INT UNSIGNED | 0 | 当前资源3(能量,用于盗贼/德鲁伊) |
| power4 | INT UNSIGNED | 0 | 当前资源4(符文能量,用于DK) |
| power5 | INT UNSIGNED | 0 | 当前资源5 |
| power6 | INT UNSIGNED | 0 | 当前资源6(符文,用于DK) |
| power7 | INT UNSIGNED | 0 | 当前资源7 |
| latency | INT UNSIGNED | 0 | 网络延迟(毫秒) |
| talentGroupsCount | TINYINT UNSIGNED | 1 | 天赋组总数(默认1,双天赋=2) |
| activeTalentGroup | TINYINT UNSIGNED | 0 | 当前激活的天赋组(0=主天赋 1=副天赋) |
| exploredZones | LONGTEXT | NULL | 已探索区域数据(位图格式) |
| equipmentCache | LONGTEXT | NULL | 装备外观缓存(客户端显示用) |
| ammoId | INT UNSIGNED | 0 | 当前装备的弹药/箭矢ID |
| knownTitles | LONGTEXT | NULL | 已获得的头衔列表 |
| actionBars | TINYINT UNSIGNED | 0 | 动作条状态掩码 |
| grantableLevels | TINYINT UNSIGNED | 0 | 可授予的等级数(战友招募系统) |
| order | TINYINT | NULL | 角色列表排序 |
| creation_date | TIMESTAMP | CURRENT_TIMESTAMP | 角色创建时间 |
| deleteInfos_Account | INT UNSIGNED | NULL | 删除操作发起者账号ID(用于恢复) |
| deleteInfos_Name | VARCHAR(12) | NULL | 删除时角色名快照(用于恢复) |
| deleteDate | INT UNSIGNED | NULL | 角色删除时间戳(非NULL=已删除待清理) |
| innTriggerId | INT UNSIGNED | NOT NULL | 旅馆休息触发器ID(用于计算双倍经验) |
| extraBonusTalentCount | INT | 0 | 额外天赋点数(自定义奖励天赋点) |
| totalTokenAmount | INT | 0 | 代币总数(自定义货币系统) |
🔍 重要字段详解
🪙 money - 金币存储
- 1234567 = 123金 45银 67铜
- 类型 INT UNSIGNED → 最大约 214748金(远超游戏上限)
- 修改金币时务必用铜币计算,避免溢出
UPDATE characters SET money = money + 1000000 WHERE guid = 1;📍 坐标系统
- 坐标精度:FLOAT类型,精确到小数点后
- 没有坐标=无法登录:角色可能出现"世界服务器断开"错误
- 传送角色:同时修改 map + position_x/y/z + orientation
- 交通工具:trans_x/y/z/o + transguid 处理在船/飞艇上的情况
UPDATE characters SET map=1, position_x=1629.36, position_y=-4373.39, position_z=31.26, orientation=3.14 WHERE guid=1;🏷️ playerFlags - 玩家标记
- 4 - GM标记(GM角色)
- 8 - 暂离(AFK)
- 16 - 勿扰(DND)
- 256 - PVP启用
- 65536 - PlayedLongTime(老玩家,让渡给朋友时不重置)
260;普通PVP = 256⚙️ at_login - 登录时执行
- 1 - 重置法术(重新学习所有职业技能)
- 2 - 重置天赋(免费洗天赋)
- 4 - 重置宠物天赋
- 8 - 经典↔TBC角色传送(主城/地狱火半岛)
- 可叠加:at_login = 3 = 重置法术+重置天赋
UPDATE characters SET at_login = at_login | 2 WHERE guid=1;⏱️ 时间相关字段
- totaltime - 总游戏时间(秒),可转换为"XX天XX小时"
- leveltime - 当前等级游戏时间,升级后重置
- logout_time - Unix时间戳,判断离线时间
- creation_date - TIMESTAMP,角色创建日期
WHERE logout_time < UNIX_TIMESTAMP() - 2592000💰 荣誉与竞技场
- totalHonorPoints - 累计荣誉点数(用于军衔和装备购买)
- todayHonorPoints / yesterdayHonorPoints - 每日荣誉(每日重置)
- totalKills - 累计击杀数
- todayKills / yesterdayKills - 每日击杀
- arenaPoints - 竞技场点数
- chosenTitle - 当前使用头衔ID(来自军衔/成就等)
🎨 外观定制
- skin - 肤色(每个种族有不同选项)
- face - 脸型
- hairStyle - 发型
- hairColor - 发色
- facialStyle - 面部特征(胡子/耳环/角等,依种族不同)
🗑️ 角色删除与恢复
- deleteDate - 非NULL = 已标记删除,值为删除时间戳
- deleteInfos_Name - 保存删除时的角色名,用于恢复
- deleteInfos_Account - 保存操作者账号,用于安全审计
- 恢复方法:将 deleteDate/deleteInfos_Name/deleteInfos_Account 设为NULL
UPDATE characters SET deleteDate=NULL, deleteInfos_Name=NULL, deleteInfos_Account=NULL WHERE guid=1 AND deleteDate IS NOT NULL;📊 补充说明
race - 种族ID速查
| 值 | 种族 | 阵营 |
|---|---|---|
| 1 | 人类 | 联盟 |
| 2 | 兽人 | 部落 |
| 3 | 矮人 | 联盟 |
| 4 | 暗夜精灵 | 联盟 |
| 5 | 亡灵 | 部落 |
| 6 | 牛头人 | 部落 |
| 7 | 侏儒 | 联盟 |
| 8 | 巨魔 | 部落 |
| 10 | 血精灵 | 部落 |
| 11 | 德莱尼 | 联盟 |
class - 职业ID速查
| 值 | 职业 |
|---|---|
| 1 | 战士 |
| 2 | 圣骑士 |
| 3 | 猎人 |
| 4 | 盗贼 |
| 5 | 牧师 |
| 6 | 死亡骑士 |
| 7 | 萨满祭司 |
| 8 | 法师 |
| 9 | 术士 |
| 11 | 德鲁伊 |
map - 常用地图ID
| 值 | 地图 | 值 | 地图 |
|---|---|---|---|
| 0 | 东部王国 | 1 | 卡利姆多 |
| 530 | 外域 | 571 | 诺森德 |
| 13 | 奥格瑞玛(副本测试) | 37 | 战歌峡谷 |
power1~7 - 资源类型按职业
| 职业 | power1 | power2 | power3 |
|---|---|---|---|
| 战士 | 怒气(Rage) | — | — |
| 圣骑士 | 法力(Mana) | — | — |
| 盗贼 | 能量(Energy) | — | — |
| 牧师 | 法力(Mana) | — | — |
| 死亡骑士 | 符文能量(Runic Power) | — | — |
| 德鲁伊 | 法力(Mana) | — | —(猫/熊用能量) |
💡 实战案例
传送角色 把角色传送到暴风城
map=0(东部王国), 暴风城坐标
-- 传送到暴风城贸易区
UPDATE characters SET
map = 0,
position_x = -8833.38,
position_y = 628.63,
position_z = 94.29,
orientation = 3.14
WHERE guid = 1;发放金币 给指定角色加金币
money以铜币为单位,10000铜=1金
-- 给角色GUID=1加500金
UPDATE characters SET money = money + 5000000
WHERE guid = 1;
-- 给所有80级角色发100金
UPDATE characters SET money = money + 1000000
WHERE level = 80;批量操作 清除角色死亡状态
设置health为1(复活),清除死亡计时器
-- 复活所有死亡的80级角色
UPDATE characters SET
health = 1,
death_expire_time = 0
WHERE health = 0
AND level = 80;统计查询 各职业在线人数
-- 按职业统计在线人数
SELECT
class,
COUNT(*) AS player_count
FROM characters
WHERE online = 1
AND deleteDate IS NULL
GROUP BY class
ORDER BY player_count DESC;清理维护 清理30天未登录的低级角色(标记删除)
-- 查询30天未登录的非满级角色(先查看,不执行)
SELECT guid, name, level, logout_time
FROM characters
WHERE logout_time < UNIX_TIMESTAMP() - 2592000
AND level < 80
AND deleteDate IS NULL
ORDER BY logout_time;❓ 常见问题
Q: 角色金币显示异常怎么办?
检查 money 字段是否溢出(超过 INT UNSIGNED 最大值约21.4万金)。用 SELECT guid, name, FLOOR(money/10000) AS gold FROM characters; 查看金币数。
Q: 角色登录后掉线/世界服务器断开?
通常是坐标问题。检查 map 和 position_x/y/z 是否有效。非法坐标(如地图不匹配)会导致角色无法加载。传送到安全坐标可修复。
Q: 如何给角色重置天赋?
方法1:UPDATE characters SET at_login = at_login | 2 WHERE guid=1;(下次登录自动重置)。方法2:清除天赋数据表 character_talent,重置 resettalents_cost=0.
Q: 删除的角色能恢复吗?
能。角色删除只是标记 deleteDate,数据还在。恢复方法:UPDATE characters SET deleteDate=NULL, deleteInfos_Name=NULL, deleteInfos_Account=NULL WHERE guid=1;