数据库字符集错误分析与解决报告
问题描述
在上一次测试日志发布文章后,系统出现数据库查询错误。
错误信息
Database Query Error
开启 Debug 模式后出现:
SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x93\x9D \xE6...' for column 'text' at row 1错误堆栈
Typecho\Db\Adapter\SQLException: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x93\x9D \xE6...' for column 'text' at row 1 in /www/wwwroot/lag.la/var/Typecho/Db/Adapter/Pdo.php:111
Stack trace:
#0 /www/wwwroot/lag.la/var/Typecho/Db.php(394): Typecho\Db\Adapter\Pdo->query()
#1 /www/wwwroot/lag.la/var/Widget/Base/Contents.php(158): Typecho\Db->query()
#2 /www/wwwroot/lag.la/var/Widget/Contents/EditTrait.php(602): Widget\Base\Contents->insert()
#3 /www/wwwroot/lag.la/var/Widget/Contents/Post/Edit.php(71): Widget\Contents\Post\Edit->publish()
#4 /www/wwwroot/lag.la/var/Widget/Contents/Post/Edit.php(358): Widget\Contents\Post\Edit->writePost()
#5 /www/wwwroot/lag.la/var/Widget/Action.php(71): Widget\Contents\Post\Edit->action()
#6 /www/wwwroot/lag.la/var/Typecho/Widget.php(155): Widget\Action->execute()
#7 /www/wwwroot/lag.la/var/Typecho/Router.php(85): Typecho\Widget::widget()
#8 /www/wwwroot/lag.la/index.php(23): Typecho\Router::dispatch()
#9 {main}问题分析
错误原因识别
通过AI查询分析,报错中的 \xF0\x9F\x93\x9D 对应的是摘要开头的表情符号 📝。
根本原因
MySQL数据库(或text字段)当前使用的是 utf8 字符集。在MySQL中:
utf8字符集只能存储最多3个字节的字符- Emoji表情属于4字节字符(UTF-8编码)
- 当尝试存储4字节字符时,会导致写入失败
解决方案
实施步骤
- 字符集升级:将数据库编码从
utf8升级为utf8mb4 - 转换操作:执行所有相关数据库表的字符集转换
实施结果
完成数据库格式转换后,系统测试正常。
验证结果
![数据库转换成功验证截图]
图:数据库转换后的正常运行状态
文档状态:已解决
影响范围:数据库写入操作
解决时间:2026年1月30日
技术环境:Typecho + MySQL
本文著作权归作者 [ 岚峰 ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
