AzerothCore 核心数据库剖析:auth、characters 与 world 表结构详解 原创
温馨提示:
本文最后更新于 2026-05-25,已超过 0 天没有更新。
若文章内的图片失效(无法正常加载),请留言反馈或直接 联系我。
一、AzerothCore 数据库概述
AzerothCore 使用三个独立数据库来管理不同的数据:auth(认证)、characters(角色)和 world(世界)。理解这三个数据库的职责分工和表结构,是进行任何自定义开发、Bug 修复或性能优化的基础。
本文聚焦于 AzerothCore 2026 年最新版本(基于 3.3.5a 分支),以实际表结构和字段定义为例,详解核心表的用途与关联关系。
| 数据库 | 主要用途 | 核心表数 | 数据量级 |
|---|---|---|---|
| auth | 账户认证、服务器列表、RBAC 权限 | ~30 张 | 小(千级记录) |
| characters | 角色数据、背包、任务、成就、公会 | ~60 张 | 中(万级记录) |
| world | 游戏世界内容:NPC、地图、技能、物品 | ~500 张 | 大(十万至百万级) |
二、auth 数据库详解
2.1 account 表 — 账户核心
+--------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------+--------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| username | varchar(32) | NO | UNI | NULL | |
| salt | binary(32) | NO | | NULL | |
| verifier | binary(32) | NO | | NULL | |
| session_key_auth | binary(40) | YES | | NULL | |
| session_key_bnet | binary(64) | YES | | NULL | |
| totp_secret | varbinary(128)| YES | | NULL | |
| email | varchar(255) | NO | | NULL | |
| reg_mail | varchar(255) | NO | | NULL | |
| joindate | timestamp | NO | | CURRENT_TIMESTAMP | |
| last_ip | varchar(15) | NO | | 127.0.0.1 | |
| last_attempt_ip | varchar(15) | NO | | 127.0.0.1 | |
| failed_logins | int(10) | NO | | 0 | |
| locked | tinyint(3) | NO | | 0 | |
| lock_country | varchar(2) | YES | | NULL | |
| last_login | timestamp | YES | | NULL | |
| online | tinyint(3) | NO | | 0 | |
| expansion | tinyint(3) | NO | | 2 | |
| mutetime | bigint(20) | NO | | 0 | |
| mutereason | varchar(255) | NO | | NULL | |
| muteby | varchar(50) | NO | | NULL | |
| locale | tinyint(3) | NO | | 0 | |
| os | varchar(4) | NO | | NULL | |
| recruiter | int(10) | NO | | 0 | |
+--------------------+--------------+------+-----+---------+----------------+
关键字段说明:
- salt + verifier:SRP6 认证协议的密码凭证,不存储明文密码
- session_key_auth / session_key_bnet:游戏登录和 Battle.net 会话密钥,用于加密通信
- totp_secret:双因素认证密钥,2025 年起新增的功能
- expansion:允许的扩展版本(0=经典、1=TBC、2=WLK)
- online:当前在线状态标记,用于防止同账号重复登录
2.2 rbac_permissions 系列表 — 权限系统
AzerothCore 引入了 RBAC(基于角色的访问控制)权限系统,替代了旧版的 gmlevel 字段:
-- rbac_permissions 表(定义所有权限项)
+---------------+--------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(100) | NO | | NULL | |
| linked_id | int(10) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
-- rbac_account_permissions(账户-权限关联)
+----------------+--------------+------+-----+---------+-------+
| accountId | int(10) | NO | PRI | NULL | |
| permissionId | int(10) | NO | PRI | NULL | |
| granted | tinyint(1) | NO | | 1 | |
| realmId | int(10) | NO | PRI | -1 | |
+----------------+--------------+------+-----+---------+-------+
2.3 realmlist 表 — 服务器列表
+--------------------+------------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| name | varchar(32) | NO | | NULL | |
| address | varchar(32) | NO | | 127.0.0.1| |
| localAddress | varchar(255) | NO | | 127.0.0.1| |
| localSubnetMask | varchar(255) | NO | | 255.255.255.0| |
| port | smallint(5) | NO | | 8085 | |
| icon | tinyint(3) | NO | | 0 | |
| flag | tinyint(3) | NO | | 2 | |
| timezone | tinyint(3) | NO | | 4 | |
| allowedSecurityLevel| tinyint(3) | NO | | 0 | |
| population | float | NO | | 0 | |
| gamebuild | int(10) | NO | | 13930 | |
+--------------------+------------------+------+-----+---------+----------------+
关键提示:gamebuild 必须与客户端版本完全匹配,否则玩家无法登录。
三、characters 数据库详解
3.1 characters 表 — 角色主表
这是全库最重要的表,每行代表一个游戏角色:
+--------------------+--------------+------+-----+---------+----------------+
| guid | int(10) | NO | PRI | NULL | auto_increment |
| account | int(10) | NO | MUL | NULL | |
| name | varchar(12) | NO | UNI | NULL | |
| race | tinyint(3) | NO | | 0 | |
| class | tinyint(3) | NO | | 0 | |
| gender | tinyint(3) | NO | | 0 | |
| level | tinyint(3) | NO | | 1 | |
| xp | int(10) | NO | | 0 | |
| money | int(10) | NO | | 0 | |
| totalKills | int(10) | NO | | 0 | |
| totalHonorPoints | int(10) | NO | | 0 | |
| totalArenaPoints | int(10) | NO | | 0 | |
| instance_id | int(10) | NO | | 0 | |
| map | smallint(5) | NO | | 0 | |
| zone | smallint(5) | NO | | 0 | |
| position_x | float | NO | | 0 | |
| position_y | float | NO | | 0 | |
| position_z | float | NO | | 0 | |
| orientation | float | NO | | 0 | |
| health | int(10) | NO | | 0 | |
| power1-6 | int(10) | NO | | 0 | |
| latency | mediumint(9) | NO | | 0 | |
| activeSpec | tinyint(3) | NO | | 0 | |
| exploredZones | longtext | YES | | NULL | |
| equipmentCache | longtext | YES | | NULL | |
| knownTitles | longtext | YES | | NULL | |
+--------------------+--------------+------+-----+---------+----------------+
3.2 背包与物品系统
-- item_instance 表(所有物品实例)
+----------------+------------------+------+-----+---------+-------+
| guid | int(10) | NO | PRI | NULL | |
| itemEntry | mediumint(8) | NO | | 0 | |
| owner_guid | int(10) | NO | | 0 | |
| creatorGuid | int(10) | NO | | 0 | |
| giftCreatorGuid| int(10) | NO | | 0 | |
| count | int(10) | NO | | 1 | |
| duration | int(10) | NO | | 0 | |
| charges | tinytext | YES | | NULL | |
| flags | mediumint(8) | NO | | 0 | |
| enchantments | text | NO | | NULL | |
| randomPropertyId| smallint(5) | NO | | 0 | |
| durability | smallint(5) | NO | | 0 | |
| playedTime | int(10) | NO | | 0 | |
| text | text | YES | | NULL | |
+----------------+------------------+------+-----+---------+-------+
-- character_inventory 表(角色背包关联)
+----------------+--------------+------+-----+---------+----------------+
| guid | int(10) | NO | PRI | NULL | auto_increment |
| item | int(10) | NO | UNI | NULL | |
| bag | int(10) | NO | | 0 | |
| slot | tinyint(3) | NO | | 0 | |
+----------------+--------------+------+-----+---------+----------------+
3.3 任务与成就
-- character_queststatus 表(任务进度)
+--------------------+--------------+------+-----+---------+-------+
| guid | int(10) | NO | PRI | NULL | |
| quest | int(10) | NO | PRI | NULL | |
| status | tinyint(3) | NO | | 0 | |
| explored | tinyint(1) | NO | | 0 | |
| timer | int(10) | NO | | 0 | |
| quest_level | smallint(3) | NO | | 0 | |
| quest_objectives | int(10) | NO | | 0 | |
+--------------------+--------------+------+-----+---------+-------+
-- character_achievement 表(成就进度)
+-------------------+--------------+------+-----+---------+-------+
| guid | int(10) | NO | PRI | NULL | |
| achievement | smallint(5) | NO | PRI | NULL | |
| date | int(10) | NO | | 0 | |
+-------------------+--------------+------+-----+---------+-------+
四、world 数据库核心表
4.1 creature_template — 生物模板
这是 world 库中最重要也是最大的表之一,定义了所有生物的静态属性:
+------------------------+------------------+------+-----+---------+-------+
| entry | mediumint(8) | NO | PRI | 0 | |
| difficulty_entry_1-3 | mediumint(8) | YES | | 0 | |
| name | varchar(100) | NO | | 0 | |
| subname | varchar(100) | YES | | NULL | |
| IconName | varchar(100) | YES | | NULL | |
| type | tinyint(3) | NO | | 0 | |
| family | tinyint(3) | NO | | 0 | |
| rank | tinyint(3) | NO | | 0 | |
| KillCredit1/2 | int(10) | NO | | 0 | |
| modelid1-4 | mediumint(8) | NO | | 0 | |
| HealthModifier | float | NO | | 1 | |
| ManaModifier | float | NO | | 1 | |
| ArmorModifier | float | NO | | 1 | |
| DamageModifier | float | NO | | 1 | |
| minlevel/maxlevel | tinyint(3) | NO | | 1 | |
| faction | smallint(5) | NO | | 35 | |
| npcflag | int(10) | NO | | 0 | |
| speed_walk/run | float | NO | | 1 | |
| scale | float | NO | | 1 | |
| mechanic_immune_mask | int(10) | NO | | 0 | |
| flags_extra | int(10) | NO | | 0 | |
| ScriptName | char(128) | YES | | NULL | |
+------------------------+------------------+------+-----+---------+-------+
4.2 smart_scripts — 智能脚本
AzerothCore 使用 SmartAI 实现大量 NPC 行为逻辑,不需要编写 C++ 代码:
+----------------+--------------+------+-----+---------+-------+
| entryorguid | int(10) | NO | PRI | 0 | |
| source_type | tinyint(3) | NO | PRI | 0 | |
| id | smallint(5) | NO | PRI | 0 | |
| link | smallint(5) | NO | | 0 | |
| event_type | tinyint(3) | NO | | 0 | |
| event_phase_mask| smallint(5) | NO | | 0 | |
| event_chance | tinyint(3) | NO | | 100 | |
| event_flags | smallint(4) | NO | | 0 | |
| event_param1-4 | int(10) | NO | | 0 | |
| action_type | tinyint(3) | NO | | 0 | |
| action_param1-6 | int(10) | NO | | 0 | |
| target_type | tinyint(3) | NO | | 0 | |
| target_param1-4 | int(10) | NO | | 0 | |
| comment | varchar(255) | YES | | NULL | |
+----------------+--------------+------+-----+---------+-------+
SmartAI 事件-动作组合示例:
-- 当 NPC 被攻击时召唤援军
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `event_type`,
`event_param1`, `action_type`, `action_param1`, `action_param2`, `comment`)
VALUES (12345, 0, 0, 4, 0, 32, 67890, 5,
'Example NPC - On Aggro - Summon Reinforcements');
-- 事件类型 4 = On Aggro(进入战斗)
-- 动作类型 32 = Summon Creature
-- 动作参数: (entry=67890, amount=5)
4.3 quest_template — 任务模板
+---------------------------+--------------+------+-----+---------+-------+
| ID | int(10) | NO | PRI | NULL | |
| QuestType | tinyint(3) | NO | | 0 | |
| QuestLevel | smallint(3) | NO | | 1 | |
| MinLevel | tinyint(3) | NO | | 0 | |
| QuestSortID | smallint(5) | NO | | 0 | |
| QuestInfoID | smallint(5) | NO | | 0 | |
| SuggestedGroupNum | tinyint(3) | NO | | 0 | |
| RewardNextQuest | int(10) | NO | | 0 | |
| RewardXPDifficulty | tinyint(3) | NO | | 0 | |
| RewardMoney | int(10) | NO | | 0 | |
| RewardBonusMoney | int(10) | NO | | 0 | |
| RewardDisplaySpell | mediumint(8) | NO | | 0 | |
| RequiredNpcOrGo1-6 | int(10) | NO | | 0 | |
| RequiredItemId1-6 | mediumint(8) | NO | | 0 | |
| RequiredItemCount1-6 | smallint(5) | NO | | 0 | |
| RewItemId1-4 | mediumint(8) | NO | | 0 | |
| RewItemCount1-4 | smallint(5) | NO | | 0 | |
| ObjectiveText1-4 | varchar(255) | YES | | NULL | |
| EndText | varchar(255) | YES | | NULL | |
| CompletedText | varchar(255) | YES | | NULL | |
| RequiredPlayerKills | smallint(5) | NO | | 0 | |
| RequiredCondition | int(10) | NO | | 0 | |
+---------------------------+--------------+------+-----+---------+-------+
五、表间关系与查询技巧
5.1 跨库关联查询示例
MySQL 不支持跨数据库的 JOIN,但 AzerothCore 的配置中所有库在同一 MySQL 实例下,可以使用 database.table 语法:
-- 查询某角色当前所在位置及地图名称
SELECT
c.name,
c.map,
m.MapName_enUS AS map_name,
c.position_x, c.position_y, c.position_z
FROM characters.characters c
JOIN world.map_template m ON c.map = m.ID
WHERE c.name = 'PlayerName';
-- 查询某角色的所有装备及属性
SELECT
c.name,
ci.slot,
it.name AS item_name,
ii.itemEntry,
ii.durability,
ii.enchantments
FROM characters.characters c
JOIN characters.character_inventory ci ON c.guid = ci.guid
JOIN characters.item_instance ii ON ci.item = ii.guid
JOIN world.item_template it ON ii.itemEntry = it.entry
WHERE c.name = 'PlayerName' AND ci.bag = 0
ORDER BY ci.slot;
5.2 性能诊断 SQL
-- 检查各库表大小
SELECT
table_schema AS 'database',
table_name,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'size_mb'
FROM information_schema.TABLES
WHERE table_schema IN ('auth', 'characters', 'world')
ORDER BY (data_length + index_length) DESC;
-- 检查失效的引用(世界刷怪引用了不存在的生物)
SELECT cg.id, cg.creature_id, ct.entry
FROM world.creature cg
LEFT JOIN world.creature_template ct ON cg.creature_id = ct.entry
WHERE ct.entry IS NULL;
六、数据库优化建议
| 优化项 | 说明 | 效果 |
|---|---|---|
| 定期 ANALYZE TABLE | 更新索引统计信息,优化查询计划 | 查询速度提升 10-30% |
| 增加 query_cache | 对 world 库的读频繁场景特别有效 | 重复查询可直接命中缓存 |
| 优化 innodb_buffer_pool_size | 设置为可用内存的 60-70% | 减少磁盘 I/O,提升吞吐量 |
| 定期清理无效刷怪点 | 删除引用不存在生物模板的记录 | 减少启动加载时间 |
| 使用索引监控工具 | 启用 MySQL slow query log | 快速定位性能瓶颈 |
七、总结
AzerothCore 的数据库设计遵循了魔兽世界官方的数据结构,并在此基础上增加了 RBAC 权限、SmartAI 等现代化改进。掌握这三个数据库的表结构,是进行以下工作的基础:
- 自定义内容开发:创建新副本、NPC、物品、任务
- Bug 修复:通过 SQL 快速定位数据不一致问题
- 数据分析:统计玩家行为、服务器负载
- 迁移升级:理解数据库变更脚本的工作原理
建议使用 HeidiSQL、Navicat 或 MySQL Workbench 等 GUI 工具进行数据库浏览,可以大幅提高效率。对于日常运维,建议编写 Python 脚本封装常用查询操作。