character_social 社交关系表
存储角色的好友、忽略和静音列表
官方文档来源表概述
character_social 表管理魔兽世界中的社交关系系统。这个表记录了角色之间的三种社交关系:好友、忽略和静音。每次玩家添加好友、屏蔽某个玩家或静音某人时,都会在此表中创建相应的记录。
通过 flags 字段的位标志来区分不同的社交关系类型。一个角色对另一个角色可以同时有多种关系标记。character_social 使用双向记录:添加好友时系统自动创建两条记录 A→B 和 B→A。
表结构
| 字段名 | 类型 | 说明 |
|---|---|---|
| guid | INT UNSIGNED | 角色全局唯一标识符(发起关系的角色,联合主键) |
| friend | INT UNSIGNED | 目标角色GUID(被关系的角色,联合主键) |
| flags | TINYINT UNSIGNED | 关系类型位标志(联合主键) |
| note | VARCHAR(48) | 好友备注(仅好友关系有效) |
核心字段说明
flags 关系类型位标志表
| flags 值 | 常量名称 | 含义 | 客户端表现 |
|---|---|---|---|
| 1 | SOCIAL_FLAG_FRIEND | 好友 | 出现在好友列表,可查看在线状态 |
| 2 | SOCIAL_FLAG_IGNORED | 忽略 | 被忽略者无法发送悄悄话/组队邀请 |
| 4 | SOCIAL_FLAG_MUTED | 静音 | 无法看到对方聊天消息 |
note 好友备注
note 字段仅在 flags=1(好友)时有实际用途,用于存储好友的备注名。最大长度 48 个字符。
双向记录机制
当玩家A添加玩家B为好友时,服务器自动插入两条记录:A→B 和 B→A。对于忽略和静音,只有发起者需要记录,因为这是单向操作。
实际案例
查看角色的好友列表
-- 查询角色1的所有好友(含对方名称和备注)
SELECT c.name AS 好友名称, c.level AS 等级, s.note AS 备注
FROM character_social s
JOIN characters c ON c.guid = s.friend
WHERE s.guid = 1 AND s.flags = 1;查看角色的所有社交关系
-- 按类型分类显示
SELECT c.name AS 目标角色,
CASE s.flags
WHEN 1 THEN '好友'
WHEN 2 THEN '忽略'
WHEN 4 THEN '静音'
END AS 关系类型, s.note AS 备注
FROM character_social s
JOIN characters c ON c.guid = s.friend
WHERE s.guid = 1
ORDER BY s.flags, c.name;查找被最多玩家忽略的角色
-- 统计被忽略次数最多的角色(可能为骚扰者)
SELECT c.name, COUNT(DISTINCT s.guid) AS 被忽略次数
FROM character_social s
JOIN characters c ON c.guid = s.friend
WHERE s.flags = 2
GROUP BY s.friend
ORDER BY 被忽略次数 DESC
LIMIT 20;常见问题
Q1: 删除好友后为什么 character_social 中还有残留记录?
正常情况下不会残留。如果出现可能是因为角色在删除好友时异常下线。建议使用 DELETE FROM character_social WHERE (guid=X AND friend=Y) OR (guid=Y AND friend=X) 来确保双向清理。
Q2: flags 字段可以组合使用吗?比如同时好友和静音?
因为 flags 是联合主键的一部分,实际上游戏中不会产生组合flag。查询时应使用 = 精确匹配而非位与运算。
Q3: 如何清理好友关系中已删除角色的残留记录?
使用 JOIN 查询:DELETE s FROM character_social s LEFT JOIN characters c ON c.guid = s.friend WHERE c.guid IS NULL。同样处理 guid 列。