请从低层次解释Wordpress如何与MySQL字符集和排序规则一起使用


10

正如问题标题所暗示的那样,我希望了解Wordpress如何与MySQL字符集和排序规则选项一起使用。正如我将在下面显示的那样,事情对我来说没有太大意义。

我按照其安装页面上的说明安装了Wordpress:

https://codex.wordpress.org/Installing_WordPress

作为说明的一部分,我按照他们的建议在命令行上手动创建MySQL数据库,即命令:

mysql> CREATE DATABASE databasename;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON databasename.* TO "wordpressusername"@"hostname"
-> IDENTIFIED BY "password";
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> EXIT

此外,按照指示,我编辑了“ wp-config.php”文件以使用UTF-8字符集:

define( 'DB_CHARSET', 'utf8' );

...并将排序规则设置留为空白:

define( 'DB_COLLATE', '' );

这就是乐趣的开始...

  1. 如果我在帖子中输入的字符不是MySQL UTF-8的一部分,而是UTF-8 MB4的一部分(例如𝌆),它将正确显示在渲染的页面上。我希望不会发生这种情况,因为我没有将字符集设置为UTF-8 MB4,而是设置了更为严格的UTF-8(当然,这是由MySQL定义的,当然不是人们普遍理解的)。

  2. 如果我在命令行上在MySQL中调查此问题,它将变得很奇怪。如果我运行show variables like 'char%';,则会收到以下响应:

    +--------------------------+----------------------------+
    | 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/ |
    +--------------------------+----------------------------+

我本来希望数据库字符集是UTF-8,而不是latin1。

  1. 如果我运行命令show variables like 'collation%';,输出为:

    +----------------------+-------------------+
    | Variable_name        | Value             |
    +----------------------+-------------------+
    | collation_connection | utf8_general_ci   |
    | collation_database   | latin1_swedish_ci |
    | collation_server     | latin1_swedish_ci |
    +----------------------+-------------------+

出于显而易见的原因,这甚至更奇怪(不会期望UTF-8数据库中的默认latin1_swedish_ci排序规则)。

  1. 最后,如果我运行show full columns from mywpdatabase.wp_posts;,则输出行(其值不为NULL)显示排序规则为:

| post_content_filtered | longtext | utf8mb4_unicode_ci |

那么我的问题-这怎么解释?当数据库在配置中定义为UTF-8时,为什么我的Wordpress安装正确显示UTF-8 MB4字符?为什么数据库在MySQL中显示为latin1,瑞典语排序规则,而不是UTF-8?而且,尽管如此,表中的各个字段为何都是utf8mb4_unicode_ci?对Wordpress与MySQL的工作方式进行低级解释将非常有帮助。谢谢!

Answers:


11

WordPress网站的wp-config.php中有两个定义:

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

有几件事最常被误解。这些定义中的常量名称可能暗示它们与数据库本身有关。他们不是。它们与数据库中的表相关。

数据库创建完全独立于表创建。WordPress不会创建数据库,并且不关心数据库的默认字符集和排序规则,只要它可以连接到数据库即可。

第一个定义中的值“ utf8”表示“ utf8”族中受限制最少的字符集,即“ utf8”或“ utf8mb4”。

如果您保留以上定义不变,那么在尝试安装您的网站之前,这就像告诉WordPress就数据库表的字符集和排序规则做出自己的选择,MySQL支持(取决于MySQL版本),并且限制最少。

WordPress在安装过程中会分析以下内容以确定其选择:

  • MySQL的版本
  • 数据库的排序规则(在wp-config.php中)

WordPress根据MySQL的版本决定使用哪一组utf8系列。有两个,以它们的名称区分:utf8utf8mb4utf8组的字符集允许最多存储3个字节的字符。utf8mb4组中的字符集允许最多存储4个字节的字符。

现在,WordPress检查DB_COLLATE define 的值。如果为空,它将使用所选utf8系列的最小限制排序规则,否则,将使用指定的值。

例子

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

如果MySQL不支持utf8mb4(旧版本),则表字符集将为utf8,排序规则为 utf8_general_ci。否则,我们可以分别期望utf8mb4utf8mb4_unicode_520_ciutf8mb4_unicode_ci(取决于MySQL版本)。

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', 'utf8_polish_ci');

旧的MySQL版本- UTF8utf8_polish_ci。较新的MySQL版本-utf8mb4utf8mb4_polish_ci( 荣幸使用_polish_ci后缀)

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'cp1250_polish_ci');

任何MySQL版本- CP1250cp1250_polish_ci

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'utf8_general_ci');

任何MySQL版本-错误(字符集和排序规则不匹配)

摘要

在大多数情况下,保持上面定义的define值不变是一个不错的选择。但是,如果希望表排序规则与您的网站的语言匹配,则可以适当地修改DB_COLLATE define 的值(例如-utf8mb4_polish_ci)。

注意:这说明了为什么字符𝌆被正确存储和检索。简而言之,您的表字符集属于utf8mb4组,而不属于utf8


1
感谢您解释Wordpress如何设置排序规则,但是您还没有解决其余的问题。如果定义了UTF-8字符集,为什么MySQL将数据库显示为latin1?为何将数据库排序规则显示为瑞典语?此外,您似乎在混淆字符集和排序规则。排序规则仅定义排序,比较规则,而不定义字符集。因此,不管使用哪种排序规则,如果字符集为UTF-8,则不应渲染其外部的字符(如狭义的MySQL定义)。
X-Mann

我将更新答案,以更清楚地说明该过程。
Frank P. Walentynowicz

1
感谢更新!我已经接受了您的回答,现在已经很清楚了。问题出在MySQL上,我缺乏专业知识-我不知道表可以使用比数据库本身更广泛的字符集。这个新信息使我放心了。我不需要更改MySQL中的默认字符集,Wordpress会在表级别对其进行处理。
X-Mann

别客气。我很高兴它有所帮助。
Frank P. Walentynowicz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.