📋 表概述

character_banned 表记录所有被封禁角色的封禁详情和历史。当GM使用 .ban character 命令封禁角色时,封禁信息会写入此表,包括封禁时间、解封时间、操作GM和封禁原因等。支持临时封禁和永久封禁。

联合主键 (guid, bandate),同一角色可有多条封禁记录(历史封禁)。active 标记当前是否处于封禁状态。属于 Ban List 系统模块。

📊 表结构

字段名类型默认值说明
guidint UNSIGNED0被封禁角色GUID(联合主键1)
bandateint UNSIGNED0封禁时间(Unix时间戳,联合主键2)
unbandateint UNSIGNED0解封时间(Unix时间戳)
bannedbyvarchar(50)NOT NULL封禁操作者名称
banreasonvarchar(255)NOT NULL封禁原因
activetinyint UNSIGNED1是否处于激活封禁状态(1=封禁中,0=已解封)

🔍 重要字段详解

⏰ bandate / unbandate - 封禁/解封时间

详细说明:两个Unix时间戳,定义封禁的时间区间。
  • bandate - 封禁开始时间(封禁命令执行的时间)
  • unbandate - 解封时间(自动解封的时间点)
  • unbandate=0 → 永久封禁(永不过期)
  • 当前时间 >= unbandate + bandate → 封禁自动解除
💡 封禁30天:bandate = UNIX_TIMESTAMP(), unbandate = UNIX_TIMESTAMP() + 2592000

👤 bannedby - 操作者

详细说明:VARCHAR(50),记录执行封禁操作的GM名称。
  • 用于追责和审计
  • 可能是GM角色名称或管理控制台标识(如'Console')
  • 玩家申诉时可用于核实操作来源

📝 banreason - 封禁原因

详细说明:VARCHAR(255),记录GM填写的封禁原因。
  • 最大255字符,可详细说明违规行为
  • 常见原因:使用外挂、广告刷屏、利用BUG、言语辱骂等
  • 玩家申诉时的重要参考依据

🔒 active - 激活状态

详细说明:TINYINT类型,标识封禁是否生效。
  • 1 = 封禁中(角色无法登录)
  • 0 = 已解封(手动或自动解封后设为0)
  • 同一角色可能同时存在 active=1(当前封禁)和 active=0(历史封禁)记录

💡 SQL示例

示例1:查询所有当前被封禁的角色

SELECT cb.guid, c.name, FROM_UNIXTIME(cb.bandate) AS ban_date, FROM_UNIXTIME(cb.unbandate) AS unban_date, cb.bannedby, cb.banreason FROM character_banned cb JOIN characters c ON c.guid = cb.guid WHERE cb.active = 1 ORDER BY cb.bandate DESC;

示例2:手动解封角色

UPDATE character_banned SET active = 0 WHERE guid = 100 AND active = 1;

示例3:查看某角色的封禁历史

SELECT FROM_UNIXTIME(bandate) AS ban_date, FROM_UNIXTIME(unbandate) AS unban_date, bannedby, banreason, active FROM character_banned WHERE guid = 100 ORDER BY bandate DESC;

❓ 常见问题

Q1: 角色被封禁后会提示什么信息?
角色登录时会提示"此角色已被封禁"并显示 banreason 中的原因、操作者和解封时间。如果 unbandate=0 则显示为"永久封禁"。
Q2: 如何永久封禁一个角色?
将 unbandate 设为 0 即为永久封禁:INSERT INTO character_banned (guid, bandate, unbandate, bannedby, banreason, active) VALUES (100, UNIX_TIMESTAMP(), 0, 'GM名', '原因', 1);