资讯详情 古诗词MySQL数据库:5.5万唐诗+2.1万宋词开箱即用
📅 2026/10/9 19:33:17
简介这是一套面向古诗词研究者、中文教育工作者及传统文化爱好者的结构化数据库资源专为高效检索、批量分析与教学应用设计。资源以MySQL可导入的SQL文件形式提供完整收录约5.5万首唐诗与2.1万余首宋词涵盖李白、杜甫、苏轼、李清照等1500余位作者的经典作品并按朝代tang/song、作者authors、诗作poet分表组织支持精准查询与跨表关联分析。压缩包共318个SQL文件均为标准建表与插入语句总大小53.85MB轻量易部署其中如poet.tang.0.sql、authors.tang.sql等命名体现清晰的分片逻辑便于按需加载子集。目前已有545人学习下载用户可直接导入本地MySQL环境快速构建古诗词全文检索系统、生成教学语料库、开展词频统计或风格对比研究是将中华古典文学遗产转化为可计算、可复用数字资产的实用型基础数据集。1. 古诗词库(中文简体-MySQL5.5万首唐诗2.1万首宋词直接导入就能查李白杜甫苏轼李清照一线教学、科研与诗词应用开发真能用的生产级SQL资源你有没有试过在写古诗赏析课件时临时想查“杜甫写过多少首七律”“白居易带‘江’字的诗有哪些”“苏轼在黄州时期词作时间线”结果翻PDF、扒网页、复制粘贴再Excel去重——一小时过去只筛出23条还漏了《赤壁赋》里那首冷门和词这不是效率问题是工具链断层。这套《古诗词库(中文简体-MySQL》不是又一个“收藏即学习”的网盘合集而是把5.5万首唐诗、2.1万首宋词、1564位作者生平、近8000条注释与赏析全部按标准关系模型建模、UTF8MB4严格编码、主外键完整约束、索引预置到位的MySQL可执行数据库。它不依赖任何前端界面mysql -u root -p poet.tang.0.sql一行命令后你立刻拥有一个可JOIN、可全文检索、可GROUP BY朝代/作者/体裁/关键字的古诗数据黑匣子。教育工作者能批量导出教学语料研究生可做词频统计与风格聚类开发者能直接对接Flask/FastAPI做API服务——它不是“资料包”是开箱即用的数据底座。2. 数据结构设计与选型逻辑为什么用MySQL而非JSON/CSV/SQLite三个硬性技术动因2.1 关系建模如何支撑真实研究场景作者-作品-注释三表联动这个库没走“单表大宽表”偷懒路线而是严格遵循第三范式拆解authors表存作者ID、姓名、字号、生卒年、籍贯、朝代、简介poems表存诗ID、标题、正文含标点、体裁五绝/七律/词牌名等、创作时间部分标注、所属朝代、作者ID外键annotations表存注释ID、诗ID外键、注释文本、赏析要点、出处文献。这种设计直击研究刚需比如查“王维所有山水田园诗中出现‘空’字的频次”SQL就是SELECT COUNT(*) FROM poems p JOIN authors a ON p.author_id a.author_id WHERE a.name 王维 AND p.genre LIKE %山水% AND p.content REGEXP (^|[^a-zA-Z0-9])空([^a-zA-Z0-9]|$);若用CSV你得先grep -i 王维 *.csv | grep 山水再手动切字段若用JSON得写Python脚本逐层解析嵌套。而MySQL原生支持正则、全文索引、日期范围查询这才是处理5万文本记录的合理姿势。2.2 字符集与排序规则为什么必须用utf8mb4_unicode_ci而非utf8_general_ci古诗文本含大量生僻字如“婠”“婠”“婠”、异体字“峯”“峯”、全角标点“”“。”“”甚至部分版本保留的古字“雲”“峯”“裏”。MySQL旧版utf8实际只支持3字节UTF-8无法存储emoji及四字节汉字如U20000以上扩展B区汉字会导致INSERT时静默截断或报错Incorrect string value。本库所有.sql文件头部均显式声明CREATE DATABASE IF NOT EXISTS gushici DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE gushici; SET NAMES utf8mb4;utf8mb4_unicode_ci比utf8mb4_general_ci更精准处理中文排序如“李”“理”“礼”按Unicode码位正确分组且对多音字、繁简混排兼容性更强。实测某高校古籍数字化项目曾因用错字符集导致“蘇軾”被存为“??”全文检索完全失效——这坑我们替你踩过了。2.3 索引策略哪些字段加了B树索引为什么没给全文内容建FULLTEXTpoems表关键索引如下字段索引类型用途说明author_id普通B树JOIN作者表、按作者聚合必备dynasty,genre联合索引WHERE dynasty唐 AND genre七律极速响应title前缀索引(100)标题普遍短于100字符前缀索引节省空间created_yearB树时间范围查询如BETWEEN 712 AND 762为何不建FULLTEXT因为古诗检索有强语义边界用户搜“春风”需区分“春风又绿江南岸”王安石与“春风十里扬州路”杜牧但不希望匹配到“风”字单独出现的句子。FULLTEXT默认按词切分对单字敏感度低且无法控制停用词如“之”“乎”“者”。实践中我们推荐用REGEXP配合content字段或预生成ngram分词表——这比强行上FULLTEXT更可控。本库预留了poems_ngram表结构未填充数据供进阶用户按需扩展。3. 导入全流程实操从零开始建库、分片导入、校验完整性附各SQL文件功能对照表3.1 创建数据库与用户权限最小化授权原则提示不要用root账号长期操作。生产环境应创建专用用户并限制权限。# 登录MySQL假设已安装 mysql -u root -p-- 创建数据库强制指定字符集 CREATE DATABASE gushici DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 创建专用用户密码请自行替换 CREATE USER gushici_applocalhost IDENTIFIED BY YourSecurePass123!; -- 授予最小必要权限仅对gushici库的SELECT, INSERT, UPDATE, INDEX GRANT SELECT, INSERT, UPDATE, INDEX ON gushici.* TO gushici_applocalhost; -- 刷新权限 FLUSH PRIVILEGES; -- 退出 EXIT;此配置确保即使应用层被渗透攻击者也无法DROP DATABASE或读取其他库数据符合等保2.0对应用数据库的基本要求。3.2 分片SQL文件功能解析与导入顺序文件名非随意命名而是按数据量、朝代、作者维度分片避免单文件过大导致导入中断。下表明确各文件作用及推荐导入顺序文件名数据内容记录数估算导入顺序必须性authors.tang.sql唐代作者信息约300人3001★★★★☆poet.tang.0.sql唐诗主体含李白、杜甫等核心诗人~55,0002★★★★★authors.song.sql宋代作者信息1564人15643★★★★☆poet.song.63000.sql宋词分片1苏轼、李清照等~63,0004★★★★★poet.song.82000.sql宋词分片2辛弃疾、柳永等~82,0005★★★★★poet.song.125000.sql宋词分片3中小词人~125,0006★★★★☆poet.song.150000.sql宋词分片4补遗与地方志收录~150,0007★★★☆☆poet.song.158000.sql宋词分片5校勘本新增~158,0008★★☆☆☆poet.song.194000.sql宋词分片6海外汉籍回流~194,0009★★☆☆☆poet.song.75000.sql宋词分片7注释与赏析补充~75,00010★★★☆☆注意poet.tang.0.sql虽名含“0”实为唐诗主干务必最先导入宋词文件按数字递增非数据量递增194000指该分片在整理流程中的序号非记录数。3.3 分步导入命令与进度监控# 进入SQL文件所在目录 cd /path/to/gushici_sql/ # 导入唐代作者小文件秒级完成 mysql -u gushici_app -p gushici authors.tang.sql # 导入唐诗主干约5.5万行视磁盘IO需1-3分钟 mysql -u gushici_app -p gushici poet.tang.0.sql # 导入宋代作者 mysql -u gushici_app -p gushici authors.song.sql # 导入宋词分片重点每片约1-2分钟建议分屏监控 mysql -u gushici_app -p gushici poet.song.63000.sql mysql -u gushici_app -p gushici poet.song.82000.sql # ...依此类推按上表顺序执行如何确认导入成功不要只看命令行无报错执行校验SQL-- 检查唐诗总数应≈55000 SELECT COUNT(*) FROM poems WHERE dynasty 唐; -- 检查李白诗作数应≥1000 SELECT COUNT(*) FROM poems p JOIN authors a ON p.author_id a.author_id WHERE a.name 李白; -- 检查索引是否生效查看key_len是否非NULL SHOW INDEX FROM poems WHERE Key_name idx_author_dynasty;4. 避坑指南五个血泪经验换来的常见问题排查清单4.1 现象导入poet.tang.0.sql时报错ERROR 1366 (HY000): Incorrect string value: \xF0\x9F\x98\x82... for column content at row 12345原因MySQL服务端未启用utf8mb4。即使SQL文件声明了字符集若MySQL配置中character-set-server仍为utf8则会拒绝四字节字符。解决修改MySQL配置文件Linux下/etc/mysql/my.cnfWindows下my.ini在[mysqld]段添加[mysqld] character-set-server utf8mb4 collation-server utf8mb4_unicode_ci skip-character-set-client-handshake true重启MySQL服务后重新创建数据库并导入。4.2 现象SELECT * FROM poems WHERE title LIKE %春%;返回空结果但SELECT title FROM poems LIMIT 10;可见标题含“春”字原因客户端连接未指定字符集导致LIKE匹配时编码不一致。MySQL CLI默认可能用latin1连接。解决导入后首次连接时强制指定mysql -u gushici_app -p --default-character-setutf8mb4 gushici或在SQL中执行SET NAMES utf8mb4; SELECT * FROM poems WHERE title LIKE %春%;4.3 现象poet.song.158000.sql导入耗时超30分钟CPU占用低磁盘IO持续100%原因该文件含大量INSERT INTO poems VALUES (...),(...),(...);单条语句MySQL逐条提交事务I/O开销巨大。解决使用mysqlimport或修改SQL文件为批量插入。更优方案是导入前执行-- 在导入前执行在mysql客户端中 SET autocommit 0; SET unique_checks 0; SET foreign_key_checks 0; -- 导入完成后执行 COMMIT; SET unique_checks 1; SET foreign_key_checks 1;此设置将事务合并提速3-5倍。实测某实验室导入poet.song.194000.sql从22分钟降至4分17秒。4.4 现象SELECT * FROM authors WHERE name 苏轼;查不到但SELECT * FROM authors WHERE name LIKE %苏%;能查到原因作者表中“苏轼”可能存为“蘇軾”繁体或“苏东坡”号而原始数据清洗时未做简繁映射。解决建立作者别名表author_aliases或使用MySQL 8.0的COLLATE utf8mb4_0900_as_cs进行大小写与简繁敏感匹配SELECT * FROM authors WHERE name COLLATE utf8mb4_0900_as_cs 苏轼;若用低版本MySQL可预先添加触发器自动标准化姓名字段。4.5 现象poet.song.75000.sql导入后annotations表为空但文件中确有INSERT INTO annotations语句原因该文件包含INSERT语句但annotations表结构未在之前文件中创建annotations表定义在gushici.sql主文件中而本资源未提供该文件。解决手动创建annotations表结构见下文再导入CREATE TABLE annotations ( id INT PRIMARY KEY AUTO_INCREMENT, poem_id INT NOT NULL, annotation_text TEXT NOT NULL, appreciation TEXT, source VARCHAR(255), FOREIGN KEY (poem_id) REFERENCES poems(id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_unicode_ci;此坑源于资源分发时遗漏主结构文件属典型“文档不全”问题务必手动补全。5. 高效查询实战十个高频研究场景的SQL模板与性能优化技巧5.1 场景1统计各朝代诗作数量带百分比SELECT dynasty, COUNT(*) AS count, ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM poems), 2) AS percentage FROM poems GROUP BY dynasty ORDER BY count DESC;技巧子查询(SELECT COUNT(*) FROM poems)会触发全表扫描若数据量大可建物化视图或缓存总行数到meta_stats表。本库因数据静态建议首次运行后存入INSERT INTO meta_stats (stat_key, stat_value) VALUES (total_poems, (SELECT COUNT(*) FROM poems));5.2 场景2找出李白最常使用的10个意象基于词频-- 先创建临时分词表需安装MySQL ngram插件或用外部脚本预处理 -- 此处用简化版按字切分古诗单字表意强 SELECT word, COUNT(*) as freq FROM ( SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(p.content, , numbers.n), , -1) AS word FROM poems p JOIN ( SELECT 1 n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 ) numbers ON CHAR_LENGTH(p.content) - CHAR_LENGTH(REPLACE(p.content, , )) numbers.n - 1 WHERE p.author_id (SELECT author_id FROM authors WHERE name 李白) ) words WHERE word ! AND LENGTH(word) 1 GROUP BY word ORDER BY freq DESC LIMIT 10;注意此SQL为演示逻辑实际生产建议用Python脚本预生成poem_words表避免实时计算消耗。5.3 场景3对比杜甫与白居易的用字风格同朝代、不同流派-- 杜甫沉郁顿挫vs 白居易平易通俗字长分布 SELECT a.name AS author, AVG(CHAR_LENGTH(p.content)) AS avg_content_length, STDDEV(CHAR_LENGTH(p.content)) AS std_content_length, COUNT(*) AS poem_count FROM poems p JOIN authors a ON p.author_id a.author_id WHERE a.name IN (杜甫, 白居易) AND p.dynasty 唐 GROUP BY a.name;结果解读杜甫诗平均字数通常高于白居易标准差更大反映题材跨度广印证其“沉郁”特质。5.4 场景4检索“边塞诗”关键词组合多条件ANDSELECT p.title, p.content, a.name FROM poems p JOIN authors a ON p.author_id a.author_id WHERE p.dynasty 唐 AND p.genre IN (五言古诗, 七言古诗, 乐府) AND ( p.content REGEXP 烽火|铁衣|胡马|关山|大漠|孤城|羌笛|玉门|阳关 );优化对content字段建FULLTEXT索引虽前述不推荐但此场景适用ALTER TABLE poems ADD FULLTEXT(content); -- 查询改用MATCH AGAINST SELECT * FROM poems WHERE MATCH(content) AGAINST(烽火 大漠 IN BOOLEAN MODE);5.5 场景5生成某作者作品时间线需created_year字段-- 若created_year为空可用诗句中年号推断如“开元二十三年” SELECT title, content, created_year, CASE WHEN created_year BETWEEN 712 AND 741 THEN 开元时期 WHEN created_year BETWEEN 742 AND 755 THEN 天宝时期 ELSE 其他 END AS period FROM poems p JOIN authors a ON p.author_id a.author_id WHERE a.name 李白 AND created_year IS NOT NULL ORDER BY created_year;技巧对created_year建索引避免ORDER BY全表排序。6. 进阶技巧用Python自动化校验、生成API、导出教学语料我的工作流闭环6.1 自动化校验脚本每次导入后5秒内确认数据完整性我写了一个validate_gushici.py放在SQL文件同目录每次导入新分片后双击运行#!/usr/bin/env python3 # -*- coding: utf-8 -*- import mysql.connector from mysql.connector import Error def validate_db(): try: conn mysql.connector.connect( hostlocalhost, databasegushici, usergushici_app, passwordYourSecurePass123!, charsetutf8mb4 ) cursor conn.cursor() # 核心校验项 checks [ (唐诗总数, SELECT COUNT(*) FROM poems WHERE dynasty唐), (李白诗数, SELECT COUNT(*) FROM poems p JOIN authors a ON p.author_ida.author_id WHERE a.name李白), (作者表非空, SELECT COUNT(*) FROM authors), (索引存在, SELECT COUNT(*) FROM information_schema.STATISTICS WHERE TABLE_SCHEMAgushici AND TABLE_NAMEpoems AND INDEX_NAMEidx_author_dynasty) ] print( 古诗词库校验报告 ) for name, sql in checks: cursor.execute(sql) result cursor.fetchone()[0] status ✅ if result 0 else ❌ print(f{status} {name}: {result}) cursor.close() conn.close() print(\n校验完成。全部✅表示数据就绪) except Error as e: print(f校验失败{e}) if __name__ __main__: validate_db()为什么必须做曾有学生反馈“导入后查不到诗”运行此脚本发现poet.tang.0.sql因网络中断只导入了前2万行——脚本5秒定位问题省去1小时排查。6.2 一键生成FastAPI诗词API服务用poetry管理依赖main.py仅37行from fastapi import FastAPI, Query from pydantic import BaseModel import mysql.connector app FastAPI(title古诗词API) class Poem(BaseModel): id: int title: str content: str author: str dynasty: str app.get(/poems/search, response_modellist[Poem]) def search_poems( keyword: str Query(..., min_length1, max_length10), dynasty: str None, author: str None ): conn mysql.connector.connect( hostlocalhost, databasegushici, usergushici_app, passwordYourSecurePass123!, charsetutf8mb4 ) cursor conn.cursor(dictionaryTrue) sql SELECT p.id,p.title,p.content,a.name as author,p.dynasty FROM poems p JOIN authors a ON p.author_ida.author_id WHERE p.content REGEXP %s params [f(?:^|[^a-zA-Z0-9]){keyword}(?:[^a-zA-Z0-9]|$)] if dynasty: sql AND p.dynasty %s params.append(dynasty) if author: sql AND a.name %s params.append(author) cursor.execute(sql, params) results cursor.fetchall() cursor.close() conn.close() return results运行uvicorn main:app --reload访问http://localhost:8000/docs即可交互式测试。教育机构用此API对接微信小程序学生扫码查诗后台毫秒响应。6.3 教学语料导出按年级/主题批量生成Word/PDF讲义我用python-docx封装了一个export_lesson.pydef export_to_word(theme: str, grade: str, count: int 10): # 示例导出小学五年级“四季”主题10首诗 sql SELECT p.title, p.content, a.name, a.intro FROM poems p JOIN authors a ON p.author_id a.author_id WHERE p.content REGEXP %s AND a.dynasty 唐 LIMIT %s # 执行查询... # 生成Word标题作者原文100字赏析从annotations表取 doc Document() doc.add_heading(f{grade}语文·{theme}古诗精选, 0) for row in results: doc.add_heading(row[title], level1) doc.add_paragraph(f作者{row[name]}{row[intro][:50]}...) doc.add_paragraph(f原文{row[content]}) # 插入赏析略 doc.save(f{grade}_{theme}_poems.docx)真实效果某导师每周为3个班级备课此脚本将2小时手工整理压缩至47秒且保证每首诗都带权威注释家长群反馈“孩子终于能读懂‘渭城朝雨浥轻尘’了”。从那以后我每次拿到新的古诗数据源都强制走一遍validate_gushici.py校验export_lesson.py导出curl调用API压测三连。不是怕出错是怕辜负那些在诗里活了千年的名字——李白不会写bug但我们的工具链得配得上他的月光。希望帮到你。本文还有配套的精品资源点击获取