character_inventory 表

角色背包系统 · 管理角色所有物品的存储位置

📖 官方文档来源

📖表概述

character_inventory 表记录每个角色物品栏中所有物品的位置信息,包括:

💡 核心概念:此表只存储物品的位置映射(哪个角色、哪个背包、哪个槽位、哪个物品),物品的详细属性存储在 item_instance 表中。item 字段是主键,同时也是唯一索引。
🎯 关联关系:guidcharacters.guid(角色),itemitem_instance.guid(物品实例)。这形成了一个"角色 → 物品槽位 → 物品实例"的三级关联。

📋表结构

字段名类型默认值说明
guidINT UNSIGNED0角色GUID(关联 characters.guid)
bagINT UNSIGNED0所在容器ID(详见槽位系统)
slotTINYINT UNSIGNED0容器内的槽位编号
itemINT UNSIGNED0物品GUID(关联 item_instance.guid),主键

索引说明

索引名类型字段说明
PRIMARYBTREEitem主键(物品唯一)
guid (UNIQUE)BTREEguid, bag, slot唯一索引(同一位置只能放一个物品)
idx_guidBTREEguid角色索引(快速查询某角色所有物品)

🎒槽位系统详解

bagslot 共同确定物品在角色物品栏中的精确位置。

bag 字段取值

bag值位置说明
0主背包角色初始16格背包(不可移除)
19-22背包栏角色装备的4个背包(对应背包槽1-4)
23-38装备栏角色穿戴的装备(详见装备槽位)
39-105银行银行存储物品
106-137银行背包银行中已装备的背包
138-169钥匙链钥匙链物品

装备槽位 (bag=23-38)

bag值slot值装备位置
00头部
01颈部
02肩部
03衬衣
04胸部
05腰部
06腿部
07脚部
08手腕
09手部
010手指1
011手指2
012饰品1
013饰品2
014背部
015主手武器
016副手/盾牌
017远程武器/圣物
018弹药
💡 装备槽位说明:装备栏使用 bag=0(主背包)但 slot 值对应具体装备位置。实际上装备本身也在角色身上,通过特殊的 slot 编号区分不同装备部位。

快速参考

核心字段

guid所属角色
bag容器位置
slot槽位编号
item物品实例ID

bag 范围速查

0主背包
19-22装备的背包
23-38装备栏
39-105银行
106-137银行背包
138-169钥匙链

关联表

characters通过 guid
item_instance通过 item

索引

PRIMARYitem (唯一)
UNIQUEguid+bag+slot
idx_guidguid

💡实际案例

查询 查看角色的所有物品(含物品名称)

SELECT ci.guid, ci.bag, ci.slot, ci.item, ii.itemEntry, ii.count FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid WHERE ci.guid = 1 ORDER BY ci.bag, ci.slot;

查询 查找拥有特定装备的角色

-- 查找拥有"埃辛诺斯战刃"(itemEntry=32837)的在线角色 SELECT c.name, c.level, c.race, c.class, ci.bag, ci.slot FROM character_inventory ci JOIN item_instance ii ON ci.item = ii.guid JOIN characters c ON ci.guid = c.guid WHERE ii.itemEntry = 32837 AND c.online = 1;

查询 统计各角色背包占用情况

-- 统计每个角色在各区域的物品数量 SELECT ci.guid, c.name, SUM(CASE WHEN ci.bag = 0 THEN 1 ELSE 0 END) AS backpack_items, SUM(CASE WHEN ci.bag BETWEEN 19 AND 22 THEN 1 ELSE 0 END) AS bag_items, SUM(CASE WHEN ci.bag BETWEEN 39 AND 105 THEN 1 ELSE 0 END) AS bank_items, COUNT(*) AS total_items FROM character_inventory ci JOIN characters c ON ci.guid = c.guid GROUP BY ci.guid, c.name ORDER BY total_items DESC LIMIT 20;

清理 删除孤儿物品(库存有但 item_instance 无记录的)

-- 查找孤儿物品记录 SELECT ci.* FROM character_inventory ci LEFT JOIN item_instance ii ON ci.item = ii.guid WHERE ii.guid IS NULL; -- 删除孤儿物品记录(请先确认上面查询的结果!) DELETE ci FROM character_inventory ci LEFT JOIN item_instance ii ON ci.item = ii.guid WHERE ii.guid IS NULL;

常见问题

Q1: character_inventory 和 item_instance 有什么区别?
character_inventory 只存储物品的位置信息(谁、在哪、哪个槽位),item_instance 存储物品的属性信息(是什么、耐久、附魔等)。两者通过 item 字段关联。
Q2: 为什么同一个物品不能同时在两个位置?
因为 item 是主键(唯一),每个物品实例只能出现在一个位置。这是数据库层面的约束保证。
Q3: 如何判断物品是否被装备?
检查 bag 值:如果 bag 在 0-22 范围内,说明物品在角色身上(背包或装备栏)。bag=0 且 slot 在装备槽范围内表示已装备。
Q4: 角色背包最多能放多少物品?
主背包16格 + 最多4个装备背包(每个最大32格等)= 最多约144格背包空间。银行最多98格 + 最多7个银行背包。