character_social 社交关系表

存储角色的好友、忽略和静音列表

官方文档来源

表概述

character_social 表管理魔兽世界中的社交关系系统。这个表记录了角色之间的三种社交关系:好友、忽略和静音。每次玩家添加好友、屏蔽某个玩家或静音某人时,都会在此表中创建相应的记录。

通过 flags 字段的位标志来区分不同的社交关系类型。一个角色对另一个角色可以同时有多种关系标记。character_social 使用双向记录:添加好友时系统自动创建两条记录 A→B 和 B→A。

表结构

字段名类型说明
guidINT UNSIGNED角色全局唯一标识符(发起关系的角色,联合主键)
friendINT UNSIGNED目标角色GUID(被关系的角色,联合主键)
flagsTINYINT UNSIGNED关系类型位标志(联合主键)
noteVARCHAR(48)好友备注(仅好友关系有效)

核心字段说明

flags 关系类型位标志表

flags 值常量名称含义客户端表现
1SOCIAL_FLAG_FRIEND好友出现在好友列表,可查看在线状态
2SOCIAL_FLAG_IGNORED忽略被忽略者无法发送悄悄话/组队邀请
4SOCIAL_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 列。