📋 什么是 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

📊 表结构

字段名数据类型默认值说明
guidINT UNSIGNED0角色全局唯一ID(主键)
accountINT UNSIGNED0所属账号ID → account.id
nameVARCHAR(12)NOT NULL角色名称(最多12字符,utf8mb4_bin)
raceTINYINT UNSIGNED0种族ID(1=人类 2=兽人 3=矮人…)
classTINYINT UNSIGNED0职业ID(1=战士 2=圣骑 3=猎人…)
genderTINYINT UNSIGNED0性别(0=男 1=女)
levelTINYINT UNSIGNED0角色等级(1-80)
xpINT UNSIGNED0当前等级经验值
moneyINT UNSIGNED0金币(单位:铜币,10000=1金)
skinTINYINT UNSIGNED0肤色ID
faceTINYINT UNSIGNED0脸型ID
hairStyleTINYINT UNSIGNED0发型ID
hairColorTINYINT UNSIGNED0发色ID
facialStyleTINYINT UNSIGNED0面部特征ID(胡须/耳环等)
bankSlotsTINYINT UNSIGNED0已购买的银行背包格数
restStateTINYINT UNSIGNED0休息状态(0=正常 1=旅店休息中 2=主城休息中)
playerFlagsINT UNSIGNED0玩家标记(4=GM标记 8=AFK 16=DND 64=PlayedLongTime 256=PVP启用)
position_xFLOAT0当前位置X坐标
position_yFLOAT0当前位置Y坐标
position_zFLOAT0当前位置Z坐标
mapSMALLINT UNSIGNED0所在地图ID(0=东部王国 1=卡利姆多 571=诺森德)
instance_idINT UNSIGNED0副本实例ID(0=不在副本中)
instance_mode_maskTINYINT UNSIGNED0副本难度掩码
orientationFLOAT0朝向角度(0-2π)
taximaskTEXTNOT NULL已解锁飞行点掩码(二进制位图)
onlineTINYINT UNSIGNED0在线状态(0=离线 1=在线)
cinematicTINYINT UNSIGNED0已观看的开场动画标志
totaltimeINT UNSIGNED0角色总游戏时间(秒)
leveltimeINT UNSIGNED0当前等级游戏时间(秒)
logout_timeINT UNSIGNED0上次登出时间(Unix时间戳)
is_logout_restingTINYINT UNSIGNED0登出时是否在休息区(0=否 1=是)
rest_bonusFLOAT0双倍经验休息值(最多1.5级经验量)
resettalents_costINT UNSIGNED0下次洗天赋的费用(铜币)
resettalents_timeINT UNSIGNED0上次洗天赋的时间戳
trans_xFLOAT0交通工具上相对X坐标
trans_yFLOAT0交通工具上相对Y坐标
trans_zFLOAT0交通工具上相对Z坐标
trans_oFLOAT0交通工具上朝向
transguidINT0交通工具GUID(0=不在交通工具上)
extra_flagsSMALLINT UNSIGNED0额外标记(GM相关)
stable_slotsTINYINT UNSIGNED0已购买的兽栏格数
at_loginSMALLINT UNSIGNED0登录时需要执行的标记(1=重置法术 2=重置天赋 4=重置宠物天赋 8=经典↔TBC传送等)
zoneSMALLINT UNSIGNED0当前所在区域ID
death_expire_timeINT UNSIGNED0死亡释放时间戳(0=未死亡)
taxi_pathTEXTNULL当前飞行路径数据
arenaPointsINT UNSIGNED0竞技场点数
totalHonorPointsINT UNSIGNED0总荣誉点数
todayHonorPointsINT UNSIGNED0今日获得荣誉点数
yesterdayHonorPointsINT UNSIGNED0昨日获得荣誉点数
totalKillsINT UNSIGNED0总荣誉击杀数
todayKillsSMALLINT UNSIGNED0今日荣誉击杀数
yesterdayKillsSMALLINT UNSIGNED0昨日荣誉击杀数
chosenTitleINT UNSIGNED0当前使用的头衔ID
knownCurrenciesBIGINT UNSIGNED0已知的货币类型掩码
watchedFactionINT UNSIGNED0正在监控的声望阵营ID
drunkTINYINT UNSIGNED0醉酒值(0-100,越高越醉)
healthINT UNSIGNED0当前生命值
power1INT UNSIGNED0当前资源1(法力/怒气/能量/符文能量,按职业不同)
power2INT UNSIGNED0当前资源2(仇恨值,用于战士)
power3INT UNSIGNED0当前资源3(能量,用于盗贼/德鲁伊)
power4INT UNSIGNED0当前资源4(符文能量,用于DK)
power5INT UNSIGNED0当前资源5
power6INT UNSIGNED0当前资源6(符文,用于DK)
power7INT UNSIGNED0当前资源7
latencyINT UNSIGNED0网络延迟(毫秒)
talentGroupsCountTINYINT UNSIGNED1天赋组总数(默认1,双天赋=2)
activeTalentGroupTINYINT UNSIGNED0当前激活的天赋组(0=主天赋 1=副天赋)
exploredZonesLONGTEXTNULL已探索区域数据(位图格式)
equipmentCacheLONGTEXTNULL装备外观缓存(客户端显示用)
ammoIdINT UNSIGNED0当前装备的弹药/箭矢ID
knownTitlesLONGTEXTNULL已获得的头衔列表
actionBarsTINYINT UNSIGNED0动作条状态掩码
grantableLevelsTINYINT UNSIGNED0可授予的等级数(战友招募系统)
orderTINYINTNULL角色列表排序
creation_dateTIMESTAMPCURRENT_TIMESTAMP角色创建时间
deleteInfos_AccountINT UNSIGNEDNULL删除操作发起者账号ID(用于恢复)
deleteInfos_NameVARCHAR(12)NULL删除时角色名快照(用于恢复)
deleteDateINT UNSIGNEDNULL角色删除时间戳(非NULL=已删除待清理)
innTriggerIdINT UNSIGNEDNOT NULL旅馆休息触发器ID(用于计算双倍经验)
extraBonusTalentCountINT0额外天赋点数(自定义奖励天赋点)
totalTokenAmountINT0代币总数(自定义货币系统)

🔍 重要字段详解

🪙 money - 金币存储

详细说明:以铜币为单位存储,换算方式:100铜=1银,10000铜=1金。
  • 1234567 = 123金 45银 67铜
  • 类型 INT UNSIGNED → 最大约 214748金(远超游戏上限)
  • 修改金币时务必用铜币计算,避免溢出
💡 SQL示例:给玩家加100金 → UPDATE characters SET money = money + 1000000 WHERE guid = 1;

📍 坐标系统

详细说明:position_x/y/z 与 map 共同确定角色位置。orientation 控制朝向。
  • 坐标精度: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(老玩家,让渡给朋友时不重置)
💡 取值示例:GM+PVP = 4 + 256 = 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,角色创建日期
💡 SQL查询:查超过30天未登录的角色 → WHERE logout_time < UNIX_TIMESTAMP() - 2592000

💰 荣誉与竞技场

详细说明:PvP相关的荣誉和击杀数据。
  • 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 - 资源类型按职业

职业power1power2power3
战士怒气(Rage)
圣骑士法力(Mana)
盗贼能量(Energy)
牧师法力(Mana)
死亡骑士符文能量(Runic Power)
德鲁伊法力(Mana)—(猫/熊用能量)
💡 提示:power6 用于DK符文系统(6种符文状态),修改前确认职业。

💡 实战案例

传送角色 把角色传送到暴风城

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: 角色登录后掉线/世界服务器断开?

通常是坐标问题。检查 mapposition_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;