解决Typecho带有Emoji表情Database Query Error报错的处理方法

发布时间: 2023-05-03 热度: 1914

今天在进行文章回复评论的时候,看到手机输入法有个表情功能,就发了几个表情进行提交,在提交后系统出现了「Database Query Error」报错,叔可忍婶不可忍,都移动互联网时代了,不能因为emoji 表情符号出现报错,既然报错就试着解决吧。

解决过程

1、刚才的操作是发布了Emoji表情,emoji 是 4 个字节;

2、Typecho的数据库选用了 UTF-8 的编码,在 MySQL 中,UTF-8 只支持最多 3 个字节;

3、修改数据库 charset 为 utfmd4:

4、Mysql 运行以下编码,支持全局都能插入emoji表情等。

运行以下代码:

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;

2.修改数据库配置文件
打开网站根目录数据库配置文件 config.inc.php
将 charset 的值由 utf8 改为 utf8mb4 。

/** 定义数据库参数 */
$db = new Typecho_Db('Pdo_Mysql', 'echo_');
$db->addServer(array ( 'host' => 'localhost', 'user' => 'echo', 'password' => 'password', 'charset' => 'utf8mb4', //修改这一参数 'port' => '3306', 'database' => 'echo',
), Typecho_Db::READ | Typecho_Db::WRITE);
Typecho_Db::set($db);

修改好后保存即可。

延伸知识

1、MySQL在5.5.3之后增加了这个utf8mb4的编码,所以最低mysql版本支持版本为5.5.3+,若不是,请升级到较新版本;

2、mb4就是most bytes 4的意思,可以用来兼容四字节的unicode,存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。如果你要存互联网emoji表情,就需要utf8mb4,而不是utf-8;

3、utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换;

4、MySQL数据库的 “utf8”并不是真正概念里的 UTF-8,MySQL中的“utf8”编码只支持最大3字节每字符。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符,MySQL的开发者没有修复这个bug。他们在2010年增加了一个变通的方法:一个新的字符集“utf8mb4”,他们并没有对外公布(可能因为这个bug有点尴尬)。现在很多指南推荐用户使用“utf8”其实都错了;

5、建议MySQL和MariaDB用户使用“utf8mb4”而不是“utf8”,毕竟现在是不管使用 Anroid 设备,还是 iOS 设备,如果插入包含有 emoji 表情符号的记录时就报错,还是很尴尬的;

6、最重要一点,对数据库操作前,记得备份数据。

请在下方留下您的评论. 加入TG吹水群