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などの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/ |
    +--------------------------+----------------------------+
    

データベースの文字セットは、latin1ではなく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_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でデータベースがUTF-8ではなく、latin1スウェーデン照合として表示されるのはなぜですか?そして、なぜこれらすべてにもかかわらず、テーブルの個々のフィールドがutf8mb4_unicode_ciであるのでしょうか。WordpressがMySQLで動作する方法を低レベルで説明すると非常に役立ちます。ありがとうございました!

回答:


11

WordPressウェブサイトのwp-config.phpには2つの定義があります。

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

最も一般的に誤解されていることがいくつかあります。それらの定義の定数の名前は、それらがデータベース自体に関連していることを示唆している可能性があります。ではない。それらはデータベース内のテーブルに関連しています。

データベースの作成は、テーブルの作成から完全に独立しています。WordPressは、データベースに接続できる限り、データベースを作成せず、データベースのデフォルトの文字セットと照合順序を考慮しません。

最初の定義の値「utf8」は、「utf8」ファミリーからの最も制限の少ない文字セットを意味し、「utf8」または「utf8mb4」のいずれかです。

上記の定義を変更せずにそのままにしておくと、Webサイトをインストールする前に、データベースのテーブルの文字セットと照合に関して、WordPressが独自に選択するように指示するのと同じです。

以下は、WordPressがインストール中にその選択を決定するために分析するものです。

  • MySQLのバージョン
  • データベースの照合(wp-config.php内)

MySQLのバージョンに基づいて、WordPressは、使用するutf8ファミリーのグループを決定します。utf8utf8mb4の 2つの名前で区別されます。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バージョン-エラー(文字セットと照合の不一致)

概要

ほとんどの場合、上記で説明した定義の値を変更せずにそのままにしておくことをお勧めします。ただし、テーブルの照合順序をWebサイトの言語に一致させる場合は、DB_COLLATE定義の値を適切に変更できます(たとえば-utf8mb4_polish_ci)。

注:これは、文字𝌆が適切に格納および取得された理由を説明しています。簡単に言うと、テーブルの文字セットはutf8ではなくutf8mb4グループに属していました。


1
Wordpressが照合を設定する方法を説明していただきありがとうございます。ただし、残りのポイントについては説明していません。UTF-8文字セットが定義されている場合、MySQLはデータベースをlatin1として表示するのはなぜですか?そして、なぜそれはスウェーデン語のデータベース照合を示しているのですか?さらに、文字セットと照合順序がわかりにくいようです。照合順序は、文字セットではなく、順序付け、比較ルールのみを定義します。したがって、どの照合順序を使用しても、UTF-8が文字セットである場合、それ以外の文字(MySQLの狭義で定義)はレンダリングされません。
X-Mann 2017年

答えを更新して、プロセスをより明確に説明します。
フランクP.ワレンティノビッツ

1
更新していただきありがとうございます!私はあなたの答えを受け入れました、それは今すべて明らかです。問題はMySQLと私の専門知識の不足です-テーブルがデータベース自体よりも幅広い文字セットを使用できることを知りませんでした。この新しい情報は私の心を落ち着かせました。MySQLのデフォルトの文字セットを変更する必要はありません。Wordpressがテーブルレベルで処理します。
X-Mann

どういたしまして。お役に立てて嬉しいです。
フランクP.ワレンティノビッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.