正如问题标题所示,我想了解Wordpress是如何使用MySQL字符集和排序选项的。正如我将在下面展示的,事情对我来说没有多大意义。。。
我按照Wordpress安装页面上的说明安装了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\', \'\' );
这里是有趣的开始。。。
如果我输入的字符不是MySQL UTF-8的一部分,而是UTF-8 MB4的一部分,例如,在帖子中,它会正确显示在呈现的页面上。我本以为不会发生这种情况,因为我没有将字符集设置为UTF-8 MB4,而是设置了更严格的UTF-8(当然是由MySQL定义的,不是一般所理解的)。
如果我在命令行上调查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,而不是拉丁文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\\u swedish\\u ci排序规则是不可能的)。
最后,如果我跑步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\\U unicode\\U ci?对Wordpress与MySQL的工作方式进行低层次的解释将非常有用。非常感谢。
最合适的回答,由SO网友:Frank P. Walentynowicz 整理而成
wp config中有两个定义。WordPress网站php:
define(\'DB_CHARSET\', \'utf8\');
define(\'DB_COLLATE\', \'\');
有几件事最容易被误解。这些定义中的常量名称可能表明它们与数据库本身相关。事实并非如此。它们与数据库中的表相关。
数据库创建完全独立于表创建。WordPress不创建数据库,也不关心数据库的默认字符集和排序规则,只要它可以连接到数据库。
第一个define中的值“utf8”表示“utf8”系列中限制最少的字符集,即“utf8”或“utf8mb4”。
如果您在尝试安装您的网站之前保持上述定义不变,这就像告诉WordPress自己选择数据库的表字符集和排序规则,MySQL支持这些表字符集和排序规则(取决于MySQL版本),并且限制最小。
WordPress在安装过程中分析以下内容以确定其选择:
WordPress根据MySQL的版本决定数据库的排序规则(在wp-config.php中)utf8 要使用的族。有两种,以其名称区分:utf8 和utf8mb4. 来自的字符集utf8 组,允许最多存储3字节长的字符。来自的字符集utf8mb4 组,允许最多存储4字节长的字符。
现在,WordPress检查DB_COLLATE 定义如果为空,它将使用所选的最小限制排序规则utf8 否则,族将使用指定的值。
示例
define(\'DB_CHARSET\', \'utf8\');
define(\'DB_COLLATE\', \'\');
如果MySQL不支持
utf8mb4 (旧版本)则表字符集将
utf8 排序规则为
utf8_general_ci. 否则,我们可以预期
utf8mb4 和
utf8mb4_unicode_520_ci, 或
utf8mb4_unicode_ci (取决于MySQL版本)。
define(\'DB_CHARSET\', \'utf8\');
define(\'DB_COLLATE\', \'utf8_polish_ci\');
较旧的MySQL版本-
utf8 和
utf8_polish_ci. 较新的MySQL版本-
utf8mb4 和
utf8mb4_polish_ci ()
_polish_ci 后缀已接受)
define(\'DB_CHARSET\', \'cp1250\');
define(\'DB_COLLATE\', \'cp1250_polish_ci\');
任何MySQL版本-
cp1250 和
cp1250_polish_ci.
define(\'DB_CHARSET\', \'cp1250\');
define(\'DB_COLLATE\', \'utf8_general_ci\');
任意MySQL版本-错误(字符集和排序规则不匹配)
总结
在大多数情况下,保持定义的值(如上所述)不变是一个不错的选择。但是,如果希望表排序规则与网站的语言相匹配,可以修改
DB_COLLATE 适当定义(例如-
utf8mb4_polish_ci ).
Note: 这就解释了为什么要正确地存储和检索角色。简单地说,您的表字符集属于utf8mb4 组,而不是utf8.