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 等现代化改进。掌握这三个数据库的表结构,是进行以下工作的基础:

  1. 自定义内容开发:创建新副本、NPC、物品、任务
  2. Bug 修复:通过 SQL 快速定位数据不一致问题
  3. 数据分析:统计玩家行为、服务器负载
  4. 迁移升级:理解数据库变更脚本的工作原理

建议使用 HeidiSQL、Navicat 或 MySQL Workbench 等 GUI 工具进行数据库浏览,可以大幅提高效率。对于日常运维,建议编写 Python 脚本封装常用查询操作。