使用 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

阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
七日书摘官方群.jpg

分析后发现是由于用户在使用 emoji 表情进行评论时产生了错误,大概的意思是 \xF0\x9F\x91\xBD\xF0\x9F 无法存入 text 列,经过查后得知,MySQL 的 UTF8 编码只支持三个字节的存储,而 emoji 表情的字符编码需要四个字节,那么要想解决只需将 text 这列的改为 utf8mb4 编码集即可。更多分析可参考《MySQL 存储 emoji 表情符号解决方案

修改数据库配置

分析 Typecho 数据库表结构后可知,typecho_commentstypecho_contents 表中存在 text 字段,默认为 utf8 编码。

Typecho 评论和目标表结构:
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 了,如下图:

MySQL 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 了。

------完------

推荐阅读:

Typecho自定义分类和评论样式

Typecho常用必备插件(plugins)推荐

Typecho中常用函数分享

MySQL 数据库存储引擎介绍

更多学习讨论欢迎关注公众号:
qrcode_for_gh_36ba5cb42130_258.jpg