使用 Typecho 搭建 七日书摘 有一段时间了,其中各类问题也解决了不少,比如 Typecho自定义分类和评论样式 、Typecho常用必备插件(plugins)推荐 以及 Typecho中常用函数分享 等,今天关注了下错误日志后发现系统产生了如下错误:
PHP message: SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x91\xBD\xF0\x9F' for column 'text' at row 1" while reading response header from upstream
阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
分析后发现是由于用户在使用 emoji 表情进行评论时产生了错误,大概的意思是 \xF0\x9F\x91\xBD\xF0\x9F
无法存入 text
列,经过查后得知,MySQL 的 UTF8 编码只支持三个字节的存储,而 emoji 表情的字符编码需要四个字节,那么要想解决只需将 text
这列的改为 utf8mb4
编码集即可。更多分析可参考《MySQL 存储 emoji 表情符号解决方案》
修改数据库配置
分析 Typecho 数据库表结构后可知,typecho_comments
和 typecho_contents
表中存在 text
字段,默认为 utf8
编码。
Typecho 评论和目标表结构:
修改 text 字段 charset 命令:
/* 修改 text 字段 charset 为 utf8mb4 */
ALTER TABLE `typecho_comments` CHANGE `text` `text` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;
ALTER TABLE `typecho_contents` CHANGE `text` `text` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;
/* 修改数据库表charset 为 utf8mb4 */
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;
alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_unicode_ci;
alter table typecho_users convert to character set utf8mb4 collate utf8mb4_unicode_ci;
修改后可以看到表的 排序规则 (charset)为 utf8mb4 了,如下图:
另外,此处只是把表结构、数据库、字段等修改为 utf8mb4 编码,如果要彻底修改,可以按照《MySQL 存储 emoji 表情符号解决方案》进行修改 /etc/my.conf
配置。
修改 typecho 配置文件 config.inc.php
注意此时当数据库 charset 修改完成后,此时如果你迫不及待的进行验证,你会发现 Typecho 依然会返回前面提到的错误。
那是因为 config.inc.php 数据库配置文件中的 charset 依然还是 utf8 编码,因此需要按照如下进行修改。
$db->addServer(array (
'host' => 'localhost',
'user' => 'root',
'password' => '七日书摘',
'charset' => 'utf8mb4', //把 utf8 修改为 utf8mb4
'port' => '3306',
'database' => '七日书摘',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);
修改完成后 typecho 中就能正常的使用 emoji 了。
------完------
推荐阅读:
更多学习讨论欢迎关注公众号: