-- use database fortern create schema qqnt; comment on schema qqnt is 'Fortern的QQNT聊天记录'; -- QQNT 原始的 group_msg_table 表结构 -- 为了快速导入数据而创建的临时表,无需索引 create table qqnt.group_msg_tmp ( "40001" bigint primary key, "40002" bigint, "40003" integer, "40010" integer, "40011" integer, "40012" integer, "40013" integer, "40020" text, "40026" integer, "40021" text, "40027" bigint, "40040" integer, "40041" integer, "40050" integer, "40052" integer, "40090" text, "40093" text, "40800" BYTEA, "40900" BYTEA, "40105" integer, "40005" integer, "40058" integer, "40006" bigint, "40100" integer, "40600" BYTEA, "40060" integer, "40850" bigint, "40851" integer, "40601" BYTEA, "40801" BYTEA, "40605" BYTEA, "40030" bigint, "40033" bigint, "40062" BYTEA, "40083" integer, "40084" integer, "40008" integer, "40009" integer ); -- 处理后可读的 group_msg_table 表 -- https://docs.aaqwq.top/view/db_file_analysis/nt_msg.db.html create table qqnt.group_msg_table ( -- 40001 消息ID,具有唯一性 id bigint not null primary key, -- 40002 消息随机值,用于对消息去重 msg_random bigint not null, -- 40003 群聊消息ID,在每个聊天中依次递增 msg_seq integer not null, -- 40010 聊天类型,私聊为1,群聊为2,频道为4,公众号为103,企业客服为102,临时会话为100 chat_type integer not null, -- 40011 消息类型,详见下表 msg_type integer not null, -- 40012 pb消息类型,详见下表 sub_msg_type integer not null, -- 40013 发送标志,本机发送的消息为1,其他客户端发送的为2,别人发的消息为0 ,转发消息为5,在已退出或被封禁的消息中为当日整点时间戳 send_type integer not null, -- 40020 nt_uid, 对应 nt_uid_mapping_table sender_uid varchar(200) not null, -- 40026 未知 q40026 integer, -- 40021 会话ID peer_uid varchar(200) not null, -- 40027 会话ID,通常是群号 peer_uin bigint not null, -- 40040 未知 q40040 integer, -- 40041 发送状态,2为成功,0为发送被阻止(如不是对方好友),1为尚未发送成功(比如网络问题),3为消息被和谐 send_status integer not null, -- 40050 发送消息时的时间戳(精确到秒) msg_time integer not null, -- 40052 未知 q40052 integer, -- 40090 发送者群名片,旧版 QQ 迁移数据中格式为 name(12345) 或 name, QQNT 中为群名片 send_member_name varchar(200), -- 40093 发送者昵称,旧版 QQ 此字段为空,QQNT 中未设置群名片时才有此字段 send_nick_name varchar(200) not null, -- 40800 聊天消息,最为复杂 msg_content bytea, -- 40900 不同情况下存在不一样的数据(以列40011为区分)。 值为8时,列40900存贮转发聊天的缓存;值为9时,列40900存贮引用的消息 msg_quote bytea, -- 40105 未知 q40105 integer, -- 40005 只知道自己发的消息一定概率存在数值,正常情况为0 q40005 integer, -- 40058 当日 0 时整的时间戳格式,精确到秒,时区为 UTC+08:00 midnight_timestamp integer not null, -- 40006 未知 elem_id bigint not null, -- 40100 @状态 at_status integer, -- 40600 十六进制。值为 14 00 时,为回复消息,为 6 代表有人回复自己,为2代表他人回复他人,值为c2e91304a8d114****时(不唯一),为撤回消息 msg_status bytea, -- 40060 已退出或已解散的群聊标志 disband_flag integer, -- 40850 该消息所回复的消息的序号,默认为 0 reply_to bigint, -- 40851 未知,默认为 0 或 NULL q40851 integer, -- 40601 未知,默认为 NULL q40601 bytea, -- 40801 未知,默认为 NULL q40801 bytea, -- 40605 未知,默认为 NULL q40605 bytea, -- 40030 群号 group_no bigint not null, -- 40033 消息发送者QQ号 qq_no bigint not null, -- 40062 存贮详细表态信息(包括表态表情和表态数量),其数字与 QQBOT 中表情编号对应(超级表情不在此列表中) emoji bytea, -- 40083 表态表情数量总和? emoji_num integer, -- 40084 表态表情数量总和? emoji_num_2 integer, -- 40008 未知 2025年11月新增字段 q40008 integer, -- 40009 未知 2025年11月新增字段 q40009 integer ); -- 发送者QQ号索引 create index qq_no_index on qqnt.group_msg_table (qq_no); -- 群号与QQ号联合索引 create index group_no_index on qqnt.group_msg_table (peer_uin, qq_no); -- 时间索引 create index group_msg_time_index on qqnt.group_msg_table (msg_time); -- 群号与时间的索引 create index group_no_msg_time_index on qqnt.group_msg_table (peer_uin, msg_time); -- 消息类型联合索引 create index group_msg_type_index on qqnt.group_msg_table (peer_uin, msg_type, sub_msg_type); -- 40011 msg_type 消息类型 -- 无消息(消息损坏?多见于已退出群聊且时间久远):0 -- 消息空白(msgid存在,应该是没加载出来):1 -- text文本消息:2 -- 群文件:3 -- 我的聊天记录里没有4~大佬带带>︿< -- 系统(灰字)消息:5 -- 语音消息:6 -- 视频文件:7 -- 合并转发消息:8 -- 回复类型消息:9 -- 红包:10 -- 应用消息:11 -- 40012 sub_msg_type 区分pb消息类型 -- 非常规text消息:0 -- 普通文本消息:1 -- 群文件其他类型消息:1 -- 图片消息:2 -- 群文件图片消息:2 -- 群公告:3 -- 群文件视频消息:4 -- 撤回消息提醒:4 -- 群文件音频消息:8 -- 原创表情包:8 -- 射精消息:11 -- 拍一拍消息:12 -- 群文件docx消息:16 -- 平台文本消息:32 -- 群文件pptx消息:32 -- 回复类型消息:33 -- 群文件xlsx消息:64 -- 存在链接:161 -- 群文件zip消息:512 -- 群文件exe消息:2048 -- 表情消息:4096 -- msg_type(40011) 与 sub_msg_type(40012) 组合可判断消息类型 -- 由于优先级问题(特别是2类别的信息),部分消息不满足以下规则 -- 空消息:0,0 -- 已撤回消息:1,0 -- 普通文本类消息:2,1 -- 图片消息:2,2 -- 只带图片的纯文本消息:2,3 -- 纯表情消息:2,16 -- 带表情的纯文本消息:2,17 -- 带图片带表情的纯文本消息:2,19 -- 纯链接消息:2,129 -- 带表情链接消息:2,145 -- 机器人消息:2,577 -- 机器人Markdown消息:2,65 -- @消息:2,35 -- 回复引用消息(不带表情):2,33 -- 回复引用消息(带表情):2,49 -- 收藏表情:2,2 -- 收藏表情包:2,4096 -- 群文件其他类型消息:3,1 -- 群文件图片(png,jpg)消息:3,2 -- 群文件视频消息:3,4 -- 群文件音频(mp3,flac)消息:3,8 -- 群文件docx消息:3,16 -- 群文件pptx消息:3,32 -- 群文件xlsx消息:3,64 -- 群文件zip消息:3,512 -- 群文件exe消息:3,2048 -- 拍一拍消息:5,12 -- 撤回消息提醒:5,4 -- amr语音文件消息:6,0 -- 视频文件消息:7,0 -- 合并转发消息:8,0 -- 回复消息:9,33 -- 回复带图片消息(无@):9,34 -- 回复带图片消息(有@):9,35 -- 回复带图片带@:9,35 -- 回复卡片引用消息:9,49 -- 带表情回复:9,49 -- 带表情带图片带@:9,51 -- 回复存在链接的消息:9,161 -- 红包:10,0 -- 应用消息(如小程序):11,0 -- 群公告:11,3 -- 表情包:17,8 -- 原创表情:17,8 -- QQNT 原始的 c2c_msg_table 表结构 -- 为了快速导入数据而创建的临时表,无需索引 create table qqnt.c2c_msg_tmp ( "40001" bigint primary key, "40002" bigint, "40003" integer, "40010" integer, "40011" integer, "40012" integer, "40013" integer, "40020" text, "40026" integer, "40021" text, "40027" integer, "40040" integer, "40041" integer, "40050" integer, "40052" integer, "40090" text, "40093" text, "40800" bytea, "40900" bytea, "40105" integer, "40005" integer, "40058" integer, "40006" bigint, "40100" integer, "40600" bytea, "40060" integer, "40850" integer, "40851" integer, "40601" bytea, "40801" bytea, "40605" bytea, "40030" bigint, "40033" bigint, "40062" bytea, "40083" integer, "40084" integer, "40008" integer, "40009" integer ); -- 私聊消息 c2c_msg_table create table qqnt.c2c_msg_table ( -- 40001 消息ID,具有唯一性 id bigint not null primary key, -- 40002 消息随机值,用于对消息去重 msg_random bigint not null, -- 40003 位置 q40003 integer not null, -- 40010 聊天类型,私聊为1,群聊为2,频道为4,公众号为103,企业客服为102,临时会话为100 chat_type integer not null, -- 40011 消息类型,详见上表 msg_type integer not null, -- 40012 pb消息类型,详见上表 sub_msg_type integer not null, -- 40013 发送标志,可能? send_type integer not null, -- 40020 未知 q40020 varchar(200) not null, -- 40026 未知 q40026 integer not null, -- 40021 未知 q40021 varchar(200) not null, -- 40027 未知 q40027 integer not null, -- 40040 未知 q40040 integer not null, -- 40041 未知 q40041 integer not null, -- 40050 发送消息时的时间戳(精确到秒) msg_time integer not null, -- 40052 未知 q40052 integer not null, -- 40090 未知 q40090 text, -- 40093 消息发送者的 QQ 昵称或是备注名 q40093 varchar(200) not null, -- 40080 消息内容 q40800 bytea, -- 40900 未知 q40900 bytea, -- 40105 未知 q40105 integer not null, -- 40005 未知 q40005 integer not null, -- 40058 当日 0 时整的时间戳格式,精确到秒,时区为 UTC+08:00 midnight_timestamp integer not null, -- 40006 未知 q40006 bigint not null, -- 40010 未知 q40100 integer not null, -- 40600 未知 q40600 bytea, -- 40060 未知 q40060 integer not null, -- 40850 未知 q40850 integer not null, -- 40851 未知 q40851 integer not null, -- 40601 未知 q40601 bytea, -- 40801 未知 q40801 bytea, -- 40605 未知 q40605 bytea, -- 40030 对方 QQ 号(无论是对方还是自己发送的消息) peer_qq_no bigint not null, -- 40033 发送者的 QQ 号 sender_qq_no bigint not null, -- 40062 未知 q40062 bytea, -- 40083 未知 q40083 integer not null, -- 40084 未知 q40084 integer not null, -- 40008 未知 2025年11月新增字段 q40008 integer, -- 40009 未知 2025年11月新增字段 q40009 integer ); -- 时间索引 create index c2c_msg_time_index on qqnt.c2c_msg_table (msg_time); -- 私聊者 QQ 号与时间的索引 create index qq_no_msg_time_index on qqnt.c2c_msg_table (peer_qq_no, msg_time); create table qqnt.group_msg_fts ( -- 主键id id bigint primary key, -- 消息内容 msg_text text, -- 文件名 file_name varchar(250), -- 41703 未知 q41703 varchar(50), -- 41704 未知 q41704 varchar(50), -- 41705 未知 q41705 varchar(50), -- 41706 未知 q41706 varchar(50), -- 41707 未知 q41707 varchar(50), -- 41701 group_msg_table的id的外键 msg_id bigint unique, -- 40050 发送消息时的时间戳(精确到秒) msg_time integer not null, -- 40003 群聊消息ID,在每个聊天中依次递增 msg_seq integer not null, -- 40010 聊天类型,私聊为1,群聊为2,频道为4,公众号为103,企业客服为102,临时会话为100 chat_type integer not null, -- 40021 会话ID peer_uid varchar(200) not null, -- 40027 会话ID peer_uin bigint not null, -- 40020 nt_uid, 对应 nt_uid_mapping_table sender_uid varchar(200) not null ); -- 时间索引 create index msg_time_index on qqnt.group_msg_fts (msg_time); -- 群号与时间的索引 create index group_msg_time_index on qqnt.group_msg_fts (peer_uin, msg_time);