It has been 784 days since the last update, the content of the article may be outdated.
注意
- 以下演示内容基于数据库版本:shell
mysql --version
mysql Ver 15.1 Distrib 5.5.64-MariaDB, for Linux (x86_64) using readline 5.1 - utf8mb4 的最低 mysql 版本支持版本为 5.5.3+
前言
我们知道要想让数据库存储数据支持 emoji 显示必须将数据库编码格式设置为utf8mb4
,可是我在代码中修改了数据库编码还是有问题,具体见此处 Issues ,当时列出下面的怀疑:
-
数据库设置为utf8mb4
编码; -
单个表格编码未设置为utf8mb4
; -
由于前端使用pangujs
导致传到后端已经出错;
昨晚进行了排查及解决,现在记录一下。
排查
- 首先查看数据库编码格式sql
MariaDB [iyblog_product]> show create database iyblog_product;
+----------------+----------------------------------------------------------------------------+
| Database | Create Database |
+----------------+----------------------------------------------------------------------------+
| iyblog_product | CREATE DATABASE `iyblog_product` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ |
+----------------+----------------------------------------------------------------------------+
1 row in set (0.00 sec) - 查看相应表的数据格式其实此处多余,因为代码里有如下定义:sql
MariaDB [iyblog_product]> show create table iy_article;
/*省略*/
) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4 |pythonimport os
class MySQLConfig:
MYSQL_USERNAME = os.getenv('MYSQL_USER')
MYSQL_PASSWORD = os.getenv('MYSQL_PASSWORD')
MYSQL_HOST = 'localhost:3306'
MYSQL_CHARSET = 'utf8mb4' # 为了支持 emoji 显示,需要设置为 utf8mb4 编码解决
之后通过搜索知道除了把数据库和表格设置为正确编码,还要修改数据库配置。
客户端配置
shell
vi /etc/my.cnf.d/client.cnf |
Code
# |
服务端配置
bash
vi /etc/my.cnf.d/server.cnf |
Code
# |
重启 Mariadb 使配置生效
Code
systemctl restart mariadb # 如果是mysql需要起相应服务 |
验证
sql
MariaDB [iyblog_product]> SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%'; |
Code
+--------------------------+----------------------------+ |
必须保证下面的变量编码是utf8mb4
格式。
系统变量 | 描述 |
---|---|
character_set_client | (客户端来源数据使用的字符集) |
character_set_connection | (连接层字符集) |
character_set_database | (当前选中数据库的默认字符集) |
character_set_results | (查询结果字符集) |
character_set_server | (默认的内部操作字符集) |
emoji
最后我们发现了一个新问题(TODO):
链接的 slug 中直接把 emoji 也给显示出来了,此处需要对 emoji 进行过滤或者转换为字符单词。