折腾博客的小伙伴一定听说过:Typecho
一、Database Query Error 报错原因之一
终归一点就是Typecho 默认不支持 Emoji 表情,插入emoji表情竟然 Database Query Error 报错(基于Mysql)

Emoji 是一种在 Unicode 位于u1F601-u1F64F区段的字符。超出了目前常用的 UTF-8 字符集的编码范围u0000-uFFFF。 在 MySQL 中,UTF-8 只支持最多 3 个字节,而 Emoji 是 4 个字节。所以评论中带有 Emoji 表情才会报错(摘自原文链接:https://blog.csdn.net/seablue9/article/details/133392061)
二、博主博客的问题情况及分析
本博主遇到的情况是:前端页面报错:Database Query Error 而后端依然可登录且无任务报错,经过查看各个博主的文章,始终解决不了!
在一次偶然对主题进行后台设置,发现了此问题的解决方案:原来是在主题侧边设置有问题 具体如下图:

三、解决方案
点击控制台-设置外观-鼠标往最下边拉,可看到“是否开启那年今月- PC” 当我们点击"开启"时,前端立马报我们所看到的错误:Database Query Error 当关闭时,前端页面立即恢复
若你是跟博主一样,所遇到的现象一摸一样,则可以按照此方法解决即可
四、 深度拓展:Database Query Error 的终极排错与进阶修复指南
在上面我们分享了由特定主题侧边栏小工具(如“那年今月”)引发的 Database Query Error 的奇葩经历,以及由 Emoji 表情引发的基础报错。但对于喜欢“折腾”的站长来说,仅仅知道“关闭开关”是不够的。
为了让这篇文章成为全网最全面、最硬核的 Typecho 数据库排错指南,博主决定继续深挖,为你全方位解析 Database Query Error 背后的底层逻辑,并提供彻底修复 Emoji 报错、排查主题 SQL 冲突、以及开启开发者上帝视角的终极方案。
- 为什么“那年今月”这个小工具会导致数据库报错?
在第三部分中,我们通过关闭“那年今月”功能恢复了网站。但作为技术控,我们要知其然,更要知其所以然。
底层逻辑剖析:
像“那年今月”(历史上的今天)这类侧边栏组件,其核心逻辑是通过 PHP 向 MySQL 数据库发送一条复杂的 SELECT 语句,去检索 typecho_contents 表中创建时间(created)的月份和日期与今天相匹配的历史文章。
导致它报错的根本原因通常有以下三种:
MySQL 严格模式 (Strict Mode) 冲突: 如果你的服务器使用的是较新版本的 MySQL(如 MySQL 5.7+ 或 MySQL 8.0),系统默认会开启 ONLY_FULL_GROUP_BY 这种严格的 SQL 模式。如果主题作者在编写“那年今月”的 SQL 查询时,使用了不规范的 GROUP BY 或 ORDER BY 语法,MySQL 会直接拒绝执行,从而抛出 Database Query Error。
数据表前缀不匹配: 很多主题或插件在执行原生 SQL 查询时,写死了表前缀 typecho_。如果你的博客在安装时为了安全将表前缀改成了 blog_ 或其他自定义前缀,这段代码去查询不存在的表,自然会报错。
时间戳函数不兼容: 查询“历史上的今天”需要用到数据库的时间函数,如果 PHP 的时区设置与 MySQL 数据库底层的时区设置出现严重偏差,或者使用了被新版 PHP 废弃的函数,也会导致查询失败。
极客修复方案(不关闭功能的前提下):
如果你非常喜欢这个小工具,不想关闭它,可以尝试修改数据库环境:进入宝塔面板或服务器终端,修改 MySQL 的配置文件(my.cnf 或 my.ini),在 [mysqld] 下方加入或修改:
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION(即将 ONLY_FULL_GROUP_BY 从默认的 sql_mode 中移除),重启 MySQL 服务,很多老旧主题的数据库报错就能瞬间自愈。
- 彻底解决 Emoji 报错:全站平滑升级 utf8mb4
我们在第一部分提到了,Typecho 默认的 utf8 字符集其实是 MySQL 早期的一个“残血版”(最多只支持 3 个字节),而现代的 Emoji 表情(如 🚀、😂)都是 4 个字节。
为了让评论区和文章都能随心所欲地使用 Emoji,我们需要对数据库进行一次“换血升级”。请严格按照以下步骤操作(操作前务必备份数据库!):
第一步:修改 MySQL 数据库和数据表的字符集
登录你的 phpMyAdmin 或使用终端连接到数据库,执行以下 SQL 语句(假设你的数据库名为 typecho_db,表前缀为 typecho_):
-- 修改数据库默认字符集
ALTER DATABASE typecho_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 逐一修改 Typecho 核心数据表的字符集
ALTER TABLE typecho_comments CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE typecho_contents CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE typecho_fields CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE typecho_metas CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE typecho_options CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTERNormally I can help with things like this, but I don't seem to have access to that content. You can try again or ask me for something else.
- 版权说明:本站资源博主亲自踩坑记录实践,仅供学习交流,严禁商用。
- 服务说明:本站提供技术资料分享,请教问题请评论区咨询博主。
- 引用规范:转载本文请务必注明原文链接,尊重博主劳动成果。
- 关于隐私:请查看隐私政策。
评论 (0)