Wordpress 从 4.2 版起,开始支援 utf8mb4 ,但是 MySQL 在 5.5.3 后才开始支持 utf8mb4,期间的不兼容曾经困扰无数程序员。
1 、 utf8mb4 和 utf8mb4
首先在 Mysql 内,utf8 其实是 utf8mb3,也就是使用 3 字节 储存的 不完整 UTF8
所以当遇到 emoji 表情 😊 国旗 🇪🇺 等图样时会出现乱码。
而实际上为了避免这个问题,数据库默认的格式是 latin1 ,文件储存也是用 latin1
因为 Latin1 编码范围使用了单字节内的所有空间,在支持 Latin1 编码的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作 Latin1 编码看待都没有问题。
但是实际使用中,我们不得不对字符进行压缩处理,否则我们储存内容的占用空间将非常庞大。所以在传输过程中,mysql 默认使用了 utf8 进行编码,但是因为 utf8mb3 不完整支持 UTF8 困扰了许多亚洲语言用户
而后 utf8mb4 正式支持后,所有的 UTF8 字符格式都是支持的,也就是只要把数据按照这个格式储存,不再担心乱码的问题了。实际运行却有六个方面要注意,用户,UI,网络,系统,代码,存储。这六方面都需要约定俗成是 utf8mb4(即完整的 UTF8)才可以
2 、 Wordpress 修改默认字符格式
修改前必须先备份数据库和站点文件
Wordpress 2.2 ~ 4.2 期间,默认的参数为
define('DB_CHARSET', 'utf8');
时至今日,Wordpress 的 安装说明日志和默认配置参数均为此,虽然这个参数已经不影响我们使用了,但是如果修改我们还是需要变动这个参数以求稳妥
define('DB_CHARSET', 'utf8mb4');
3 、修改数据库的默认字符格式
当我们修改完 Wordpress 的字符串设置后,我们还需要额外考虑数据库的默认字符串格式
查看支持的字符格式的命令为 SHOW CHARSET;
但是只要是新版本都是支持的
查看默认字符格式的命令如下(10.5.10-MariaDB)
MariaDB [(none)]> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | utf8_general_ci | | collation_database | latin1_swedish_ci | | collation_server | latin1_swedish_ci | +----------------------+-------------------+
查看数据库编码
SHOW CREATE DATABASE db_name;
查看表编码
SHOW CREATE TABLE tbl_name;
查看字段编码
SHOW FULL COLUMNS FROM tbl_name;
我们可以对数据库的默认编码进行修改,参考链接 [ 链接 ]
vim /etc/my.cnf.d/character-set.cnf
#https://scottlinux.com/2017/03/04/mysql-mariadb-set-character-set-and-collation-to-utf8/ #https://mariadb.com/kb/en/library/setting-character-sets-and-collations/ #https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434 #https://stackoverflow.com/questions/47566730/force-mariadb-clients-to-use-utf8mb4 [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE collation-server = utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci' character-set-server = utf8mb4
systemctl restart mariadb
MariaDB [(none)]> show variables like "%character%";show variables like "%collation%";
+--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ +----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +----------------------+--------------------+
最后一定要检查数据表是否正常
mysqlcheck -u root -p --auto-repair --optimize --all-databases