三张表撑起十三万诗人与三十万首诗词:MySQL 诗词库导入与查询实战
简介这份诗词诗人数据库以MySQL为载体面向文学研究者、古诗词爱好者及需要诗词数据做检索或二次开发的开发者解决诗词与诗人信息分散、难以结构化查询的问题。资源包共3个文件均为sql脚本压缩包约47.46MB分别用于构建诗词基本信息表、诗词正文与注解赏析内容表以及诗人姓名、字号、生卒年、籍贯、代表作等资料表便于按诗人、朝代、体裁等维度分类检索。数据库收录13136位诗人、305131首诗词覆盖范围广可直接导入MySQL使用。已有2299人学习下载适合用于教学演示、学术研究、诗词类小程序或网站的数据支撑也能帮助读者快速搭建可查询、可扩展的诗词数据环境。1. 三张表撑起十三万诗人与三十万首诗词这套 MySQL 库到底能干什么拿到一个只有三个.sql文件的压缩包第一反应往往是「这么小能装多少东西」。poetry.zip解压后就是xpz_sc_poetry.sql、xpz_sc_poetry_content.sql、xpz_sc_poet.sql三个脚本没有文档、没有 ER 图、没有安装说明。但把这三个文件导入 MySQL 之后你会得到 13136 位诗人、305131 首诗词的完整结构化数据。这个量级放在任何诗词类应用里都算得上扎实——它不是 demo 数据是能直接撑起检索、分类、关联查询的底库。这套库解决的核心问题是「把非结构化的诗词文本变成可查询的关系数据」。诗人表管人物属性诗词表管作品元信息内容表管正文与注解三张表通过 ID 关联。适合谁用做诗词类小程序、做古文教学工具、做文学数据分析、或者单纯想练手 MySQL 关联查询的人。如果你正在找一份能直接导入、字段清晰、数据量够大的中文文本数据集这三个文件值得花十分钟跑一遍。下面从表结构推断、导入实操、查询验证到避坑一步步拆开讲。2. 从三个 SQL 文件反推表结构字段怎么设、关系怎么连2.1 三张表的分工与关联逻辑文件名本身就是线索。xpz_sc_poet.sql对应诗人表xpz_sc_poetry.sql对应诗词主表xpz_sc_poetry_content.sql对应诗词内容表。这种拆法在文本类数据库里很常见把「谁写的」「写了什么作品」「作品正文是什么」分成三层避免单表字段膨胀。诗人表通常包含诗人 ID、姓名、朝代、字号、生卒年、籍贯、简介等字段。诗词主表一般有诗词 ID、标题、作者 ID、朝代、体裁诗/词/曲、韵律信息等。内容表则挂诗词 ID、正文、注解、赏析。三张表通过诗人 ID 和诗词 ID 做外键关联查「杜甫在长安时期写的五言律诗」这种需求就是三表 JOIN。常见做法是诗词主表里冗余一个作者姓名字段这样列表页不用每次都 JOIN 诗人表。但冗余字段在导入时要注意和诗人表保持一致否则会出现「作者名对不上」的玄学问题。2.2 导入前先确认字符集与排序规则诗词数据里全是生僻字和多音字字符集选错直接乱码。MySQL 5.7 默认latin18.0 默认utf8mb4但utf8mb4的排序规则有utf8mb4_general_ci和utf8mb4_unicode_ci之分。诗词检索建议用utf8mb4_unicode_ci它对多语言字符的排序更准确尤其是按拼音或笔画排序时差异明显。建库时显式指定CREATE DATABASE poetry_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;导入前还要确认max_allowed_packet够大。三十万首诗词的内容表可能单条 INSERT 语句很长默认 4MB 在某些版本上会截断。临时调大SET GLOBAL max_allowed_packet 268435456;这个值是会话级的重启后失效导入完可以改回去。如果用的是云数据库控制台里一般有参数组可以调。2.3 导入顺序不能乱先诗人、再诗词、后内容三个文件有外键依赖导入顺序错了会报Cannot add or update a child row。正确顺序是# 1. 先导入诗人表建立主键 mysql -u root -p poetry_db xpz_sc_poet.sql # 2. 再导入诗词主表此时作者 ID 已存在 mysql -u root -p poetry_db xpz_sc_poetry.sql # 3. 最后导入内容表挂载正文和注解 mysql -u root -p poetry_db xpz_sc_poetry_content.sql如果脚本里没有USE poetry_db;语句命令行里必须指定库名。导入过程中如果报Duplicate entry说明之前跑过一半要么清库重来要么在脚本里找INSERT IGNORE或REPLACE INTO的写法。我一般会先DROP DATABASE再重建避免残留数据干扰。导入完成后用SHOW TABLES;确认三张表都在再用SELECT COUNT(*)核对行数是否和简介里的 13136、305131 对得上。对不上就说明有截断或跳过得回去看导入日志。3. 导入后的验证与查询把数据跑通才算数3.1 用 COUNT 和 JOIN 验证数据完整性导入完第一件事不是写业务查询是验证数据有没有缺胳膊少腿。三条 COUNT 语句跑一遍-- 诗人数量预期 13136 SELECT COUNT(*) AS poet_count FROM xpz_sc_poet; -- 诗词数量预期 305131 SELECT COUNT(*) AS poetry_count FROM xpz_sc_poetry; -- 内容表数量应该和诗词表接近或相等 SELECT COUNT(*) AS content_count FROM xpz_sc_poetry_content;如果诗词表数量对但内容表少很多可能是内容表有外键约束导致部分插入失败。用 LEFT JOIN 找孤儿记录-- 找出有诗词记录但没有内容记录的诗词 ID SELECT p.poetry_id, p.title FROM xpz_sc_poetry p LEFT JOIN xpz_sc_poetry_content c ON p.poetry_id c.poetry_id WHERE c.poetry_id IS NULL LIMIT 20;这个查询能帮你判断是数据本身缺失还是导入时被截断。如果孤儿记录集中在某几个诗人身上可能是那个诗人的作品内容特别长触发了max_allowed_packet限制。3.2 按诗人查作品最常用的关联查询诗词库最高频的查询就是「给我某个诗人的所有作品」。假设诗人表的主键是poet_id诗词表的外键也是poet_id-- 查李白的所有诗词标题和体裁 SELECT p.title, p.genre, p.dynasty FROM xpz_sc_poetry p JOIN xpz_sc_poet po ON p.poet_id po.poet_id WHERE po.name 李白 ORDER BY p.poetry_id LIMIT 50;这里用JOIN而不是LEFT JOIN因为我们要的是「有诗人记录的作品」孤儿作品不显示。ORDER BY p.poetry_id保证结果稳定分页时不会因为排序抖动导致重复或遗漏。如果诗人表里姓名有重名比如不同朝代的同名诗人需要加朝代条件SELECT p.title, p.genre FROM xpz_sc_poetry p JOIN xpz_sc_poet po ON p.poet_id po.poet_id WHERE po.name 王维 AND po.dynasty 唐;3.3 全文检索的替代方案LIKE 与全文索引的取舍MySQL 5.7 之前没有内置中文分词全文索引对中文支持很差。这套库如果没建全文索引搜诗句只能用LIKE %关键词%-- 在内容表里搜包含「明月」的诗句 SELECT c.poetry_id, c.content FROM xpz_sc_poetry_content c WHERE c.content LIKE %明月% LIMIT 100;LIKE %...%走不了索引三十万行全表扫描在本地 SSD 上大概几百毫秒到一秒勉强能用。但如果要做线上服务这个延迟不可接受。常见做法是导入 Elasticsearch 或 Meilisearch 做全文检索MySQL 只存结构化字段。如果坚持用 MySQL8.0 可以用ngram分词器建全文索引-- MySQL 8.0 建 ngram 全文索引 ALTER TABLE xpz_sc_poetry_content ADD FULLTEXT INDEX ft_content (content) WITH PARSER ngram; -- 查询时用 MATCH AGAINST SELECT poetry_id, content FROM xpz_sc_poetry_content WHERE MATCH(content) AGAINST(明月 IN BOOLEAN MODE) LIMIT 100;ngram默认 token size 是 2搜「明月」正好命中。但搜单字「月」需要把ngram_token_size改成 1改完要重建索引。这个参数是只读的得在配置文件里改完重启。3.4 分页查询的坑LIMIT OFFSET 越翻越慢诗词列表分页如果用LIMIT 20 OFFSET 10000MySQL 会先扫描前 10020 行再丢弃前 10000 行。翻到后面越来越慢。常见优化是用游标分页-- 传统分页越翻越慢 SELECT poetry_id, title FROM xpz_sc_poetry ORDER BY poetry_id LIMIT 20 OFFSET 10000; -- 游标分页记住上一页最后一个 ID SELECT poetry_id, title FROM xpz_sc_poetry WHERE poetry_id 10000 ORDER BY poetry_id LIMIT 20;游标分页要求poetry_id连续且有序这套库如果是自增主键就满足条件。如果 ID 有空洞游标分页会漏数据得改用WHERE (poetry_id, title) (last_id, last_title)这种元组比较。4. 避坑与排查导入和查询中最容易翻车的五个点4.1 导入报错Unknown command \现象用mysql file.sql导入时中途报错提示Unknown command \或ASCII \0 appeared in the statement。原因SQL 文件里包含 Windows 换行符\r\n或 BOM 头MySQL 客户端在 Linux 下解析异常。也可能是文件里有二进制字符。解决先用file命令确认编码再用dos2unix转一遍file xpz_sc_poetry.sql dos2unix xpz_sc_poetry.sql # 如果 dos2unix 没装用 sed 去掉 \r sed -i s/\r$// xpz_sc_poetry.sql转完再导入。如果还有 BOM用sed -i 1s/^\xEF\xBB\xBF//去掉。4.2 中文乱码导入后 SELECT 出来全是问号现象导入没报错但SELECT出来的诗人名和诗词内容全是???。原因客户端连接字符集和数据库字符集不一致。mysql命令行默认用latin1连接即使库是utf8mb4也会在传输时转码丢失。解决导入和查询时都显式指定字符集mysql --default-character-setutf8mb4 -u root -p poetry_db xpz_sc_poet.sql或者在 MySQL 配置文件my.cnf的[client]和[mysqld]段都加上default-character-setutf8mb4重启后永久生效。4.3 外键约束导致导入失败现象导入诗词表时报ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails。原因诗词表里引用了诗人表不存在的poet_id或者导入顺序反了。解决先确认诗人表已导入且行数正确。如果诗人表确实缺数据临时关闭外键检查再导入SET FOREIGN_KEY_CHECKS 0; -- 导入语句 SET FOREIGN_KEY_CHECKS 1;导入完再打开检查然后用LEFT JOIN找孤儿记录补数据。生产环境不建议长期关闭外键检查。4.4max_allowed_packet截断长内容现象内容表导入到一半报MySQL server has gone away或者导入完成但部分诗词正文被截断。原因单条 INSERT 语句超过max_allowed_packet限制MySQL 服务端主动断开连接。解决临时调大参数再导入SET GLOBAL max_allowed_packet 268435456;如果是云数据库改不了全局参数用mysql命令行的--max-allowed-packet选项mysql --max-allowed-packet256M -u root -p poetry_db xpz_sc_poetry_content.sql导入完记得改回默认值避免内存占用过高。4.5 查询慢没建索引的字段当条件现象按诗人姓名查作品要好几秒EXPLAIN显示typeALL全表扫描。原因诗人表的name字段没索引诗词表的poet_id没索引。解决给高频查询字段加索引-- 诗人姓名索引加速按名查人 ALTER TABLE xpz_sc_poet ADD INDEX idx_name (name); -- 诗词表作者 ID 索引加速 JOIN ALTER TABLE xpz_sc_poetry ADD INDEX idx_poet_id (poet_id); -- 内容表诗词 ID 索引加速关联 ALTER TABLE xpz_sc_poetry_content ADD INDEX idx_poetry_id (poetry_id);加完索引再用EXPLAIN确认type变成ref或eq_ref。注意索引不是越多越好写入频繁的表加太多索引会拖慢导入速度。5. 进阶用法把诗词库接进应用层的两个具体技巧5.1 用视图封装三表 JOIN简化应用层查询应用层每次写三表 JOIN 容易出错建一个视图把常用字段拼好CREATE VIEW v_poetry_full AS SELECT p.poetry_id, p.title, p.genre, p.dynasty, po.name AS poet_name, po.dynasty AS poet_dynasty, c.content, c.annotation FROM xpz_sc_poetry p JOIN xpz_sc_poet po ON p.poet_id po.poet_id LEFT JOIN xpz_sc_poetry_content c ON p.poetry_id c.poetry_id;视图不存数据查询时实时计算。好处是应用层只写SELECT * FROM v_poetry_full WHERE poet_name 杜甫不用关心底层表结构。坏处是视图不能建索引复杂查询还是得回原表。我一般只在列表页和详情页用视图统计类查询直接写 JOIN。5.2 导出 JSON 给前端用JSON_OBJECT和JSON_ARRAYAGGMySQL 5.7 开始支持 JSON 函数可以直接把查询结果拼成 JSONSELECT JSON_OBJECT( poet, po.name, dynasty, po.dynasty, poems, JSON_ARRAYAGG( JSON_OBJECT(title, p.title, genre, p.genre) ) ) AS poet_json FROM xpz_sc_poet po JOIN xpz_sc_poetry p ON po.poet_id p.poet_id WHERE po.name 苏轼 GROUP BY po.poet_id;这个查询返回一个 JSON 对象包含诗人信息和作品列表。前端拿到直接渲染不用二次组装。注意JSON_ARRAYAGG在 MySQL 5.7 里没有排序保证如果要求作品按 ID 排序得用子查询先排好再聚合。5.3 验证数据质量的三个 SQL 习惯从那以后我每次导入这类文本库都强制走一遍三个检查第一SELECT COUNT(*)核对总数第二LEFT JOIN找孤儿记录第三随机抽 10 条SELECT *肉眼确认中文没乱码、字段没串位。这三个动作花不了两分钟但能挡住 90% 的导入事故。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

DDPM PyTorch实现全解析:从加噪到采样生成图像

DDPM PyTorch实现全解析:从加噪到采样生成图像

简介:面向深度学习与生成式模型研究者的DDPM可运行源码包,聚焦扩散模型基础理论在PyTorch中的完整落地。压缩包共27个文件,大小约22.21MB,包含8个Python脚本、1个pth模型权重、MNIST的idx训练测试数据及相关gz压缩文件&#xff0c…

2026/10/13 3:52:56 阅读更多 →
Jupyter下载后内核连不上?用PyCharm集成彻底解决环境配置难题

Jupyter下载后内核连不上?用PyCharm集成彻底解决环境配置难题

项目待办里有一条长期没消掉的记录:【问题保留】Jupyter下载另一解决方式(Pycharm里)。一开始我以为是简单的“下载 Jupyter 失败”,直到自己动手试了一遍,才发现真正的坑在于:Jupyter 下载完只是第一步&am…

2026/10/13 3:52:56 阅读更多 →
多账户自动预约系统源码架构:并发调度、会话隔离与状态机实践

多账户自动预约系统源码架构:并发调度、会话隔离与状态机实践

简介:这是一套面向i茅台App多账户自动预约场景的完整系统源码,适合具备一定Java与前端基础、希望自建预约工具的技术人员或运维爱好者。项目解决多账号批量预约、门店自动新增与账号统一管理等需求,内置上千家门店数据,添加账号后…

2026/10/13 3:51:56 阅读更多 →

最新新闻

吉林大学编译原理实战:Lex/Yacc/C手写编译器全流程

吉林大学编译原理实战:Lex/Yacc/C手写编译器全流程

简介:本资源是吉林大学编译原理课程的完整实践配套包,面向计算机专业本科生、考研备考学生及编译器技术初学者,聚焦词法分析、语法解析、中间代码生成与目标代码实现等核心能力训练。压缩包共27个文件,涵盖4个Java源码&#xff08…

2026/10/13 4:39:10 阅读更多 →
Open Code Review:可验证、可教学、可持续的开源协作新范式

Open Code Review:可验证、可教学、可持续的开源协作新范式

1. 这不是代码审查,是开源协作的“显微镜”与“压力测试仪”“open-code-review”这个词组乍看像一个技术名词,实则是一套正在悄然重塑开发者协作范式的实践方法论。它不依赖某个特定工具、不绑定某家平台、也不属于某类官方流程——它本质上是一种可被任…

2026/10/13 4:39:10 阅读更多 →
Windows下MySQL安装与配置全攻略:从ZIP包到服务注册的实战指南

Windows下MySQL安装与配置全攻略:从ZIP包到服务注册的实战指南

1. 安装前想清楚:版本选择与下载1.1 为什么不要直接点"最新版"很多人第一次装 MySQL,习惯性直接去官网下最新版本,结果装完连配置都找不到,或者跟老项目的连接驱动不兼容。我在 Windows 上装过不少次 MySQL,…

2026/10/13 4:39:10 阅读更多 →
CWRU轴承数据集深度解析:从原始.mat到故障诊断Pipeline

CWRU轴承数据集深度解析:从原始.mat到故障诊断Pipeline

简介:本资源是面向机械故障诊断研究者、研究生及工业智能运维工程师的经典轴承数据集实践套件,聚焦滚动轴承多工况故障识别与模型验证需求。资源完整包含CWRU原始振动信号(165个MAT文件,涵盖正常、内圈/外圈/滚珠不同故障尺寸共10…

2026/10/13 4:39:10 阅读更多 →
LiteLLM:大模型协议统一与智能路由的工程实践

LiteLLM:大模型协议统一与智能路由的工程实践

1. 从“调用大模型像调用API”说起:LiteLLM到底在解决什么真问题?你有没有过这样的经历:上周刚用OpenAI的gpt-4-turbo跑通一个客服对话系统,这周客户突然要求切换成Anthropic的claude-3-haiku——结果发现,光是把opena…

2026/10/13 4:39:10 阅读更多 →
开放代码审查:让评审过程透明可追溯的团队实践

开放代码审查:让评审过程透明可追溯的团队实践

代码审查这件事,几乎所有团队都说自己在做,但真正做好的没几个。我见过太多项目把Review变成了例行公事:上线前临时拉人点个“同意”,评论区里互相打哑谜,新人面对一堆历史PR完全不知道当初为什么这么写。今天想聊的“…

2026/10/13 4:38:09 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →