说真的,文章没有表情之类的点缀,真的是感觉很没有生机,像我这种喜欢用表情的人,纯文本博客根本看不下去,是很难受的啊有木有!

前情提要

Typecho 默认创建的数据库编码是 utf8,字符的最大长度为 3 个字节,而 emoji 需要 4 个字节。所以在发表文章或用户评论时,如果输入了 emoji 表情符号,就会遇到数据库查询之类的错误,比如文章内容丢失、表情变成问号等。

MySQL 在 5.5.3 版本之后增加了 utf8mb4 的编码「mb4 就是 most bytes 4 的意思」,专门用来兼容四字节的 unicode,而 utf8 是 utf8mb4 的子集,所以不需要额外的转换。

解决方案

新站:

如果是新建站,那么建立数据库的时候就要更改编码为 utf8mb4 + utf8mb4_general_ci。

这样默认建表的编码就全部为 utf8mb4 了,最后修改 config.inc.php 文件:

/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 'typecho_');
$db->addServer(array (
  'host' => '1.2.3.4',
  'user' => 'root',
  'password' => 'phpgao',
  'charset' => 'utf8mb4',  # 这一行如果不是 utf8mb4 请修改为 utf8mb4
  'port' => '3306',
  'database' => 'phpgao',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

旧站:

首先修改数据表编码「执行下方 SQL 语句」:

alter table typecho_comments convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_contents convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_fields convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_metas convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_options convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_relationships convert to character set utf8mb4 collate utf8mb4_general_ci;
alter table typecho_users convert to character set utf8mb4 collate utf8mb4_general_ci;

然后修改 config.inc.php 文件即可,方法同新站。

让我们试试效果吧。