问题简述
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