MYSQL 支持 Emoji 表情

问题简述

Emoji 表情不能正确保存,查阅资料后发现是 Mysql 数据库的问题,这里给出两种解决办法,一种是在 mysql 的 命令行 操作,另一种是借助 navicat 等数据库可视化工具:

mysql 命令行

通过数据库的命令行也可以修改,不过稍微麻烦一些,如果没有数据库管理工具的可以考虑使用命令行

登录 mysql

mysql -u username -p

修改数据库字符集
把 db_name 换成 typecho 的数据库名

ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci

修改表字符集

这个要执行多次

把 tb_name 换成 typecho 的表名

ALTER TABLE tb_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_c

修改列字符集

alter table typecho_contents modify column text text character set utf8mb4 collate utf8mb4_bin;

数据库管理工具

打开 Navicat 并连接数据库

如果不能成功连接到数据库,考虑是以下方面的原因:

  • IP 地址、用户名、密码、端口号有错误
  • 云主机的安全组未放开 3306 端口,可通过网页控制台或手机 APP 放开
  • 服务器的防火墙没打开 3306 端口,ubuntu 可以通过 ufw allow 3306/tcp 打开,或者暂时先关闭防火墙,一会儿再打开 ufw disable | ufw enable
  • 数据库不允许远程连接,可以通过 宝塔面板 => 数据库 => 权限 进行更改,或者参考 一篇方案
  • 安装了宝塔面板的,也需要在 宝塔面板 => 安全 => 防火墙 去放开 3306 端口

修改数据库字符集

连接好了以后,右键数据库 => 编辑数据库,修改字符集为 utf8mb4,修改排序规则为 utf8mb4_general_ci

然后在各个表名处 右键 => 设计表 => 选项 ,修改字符集为 utf8mb4,修改排序规则为 utf8mb4_bin,其实排序规则是不影响的,设置为 utf8mb4_general_ci 或者 utf8mb4_unicode_ci 也可以,设置完之后保存

最后,对存储文章所在的表所在的列执行一行SQL语句,SQL 语句最后的字符集最好和前面的保持一致

alter table typecho_contents modify column text text character set utf8mb4 collate utf8mb4_bin;

修改 php 与 mysql 的连接

打开网站根目录下的 config.inc.php,修改文件底部 charset 为 utf8mb4:

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

重启数据库

systemctl restart mysqld