将 Wordpress 默认的数据库格式修改为 utf8mb4

2018-12-23 1371点热度 0人点赞

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

StarryVoid

Have a good time