今天写表情包文章的时候发布时发现一直报Database Query Error,搞不清怎么回事,其他文章都没这个问题。
于是我首先打开typecho调试模式。在根目录index.php下添加这个:define('__TYPECHO_DEBUG__',true);
然后重新提交有了更详细的报告:

    SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF0\x9F\x98\x//...一大串

观察了下,错误好像是出在文章内容。我查了下,发现是数据库的问题,因为数据表编码utf-8只支持3个字节的字符存储,然而我内容里有四个字节的表情,所以出现了这个问题。
又因为表情是包含在链接里的,不好去掉,就只能对数据库里动手了。:astonished:
实际上,MySQL为了解决这个问题,在5.5.3版本之后转而支持了存储4个字节的utf8字符,字符集为utf8mb4.这个相当于windowsX64和windowsX86的区别,64位是兼容32位的,也就是说utf8mb4存取utf8都是没有问题的。
所以说,只要把数据表编码改成utf8mb4就OK了。

  1. 进入数据库,执行如下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;
  1. 修改根目录下config.inc.php文件中的数据库参数:
/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 'typecho_');
$db->addServer(array (
  'host' => 'localhost',
  'user' => 'blog',
  'password' => 'byT8wsKJnF',
  'charset' => 'utf8mb4',//把这行改了就行
  'port' => '3306',
  'database' => 'blog',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

再去试试发布文章,就没问题了
![Screenshot_2019-07-09 编辑 [表情包]表情包资源!超丰富! - 时与空的终点 - Powered by Typecho.png](https://blog.irow.top/usr/uploads/2019/07/2577637679.png)
Screenshot_2019-07-09 管理文章 - 时与空的终点 - Powered by Typecho.png

最后修改:2019 年 08 月 27 日 02 : 20 PM
如果觉得我的文章对你有用,请随意赞赏