MySQLを使用したことがある場合は、必然的に文字セットと照合に出くわします。このブログ投稿では、これら2つが何であるか、およびそれらをどのように使用する必要があるかについて、より詳細に説明します。
文字セットと照合とは何ですか?
簡単に言えば、MySQLの文字セットは記号とエンコーディングのセットです。照合は文字セット内の文字を比較するためのルールのセットです。つまり、文字セットは文字列で有効な文字のセットであり、照合は特定の文字セットの文字を比較するために使用されるルールのセットです。各文字セットにデフォルトの照合があるのと同じように、文字セットにも複数の照合を含めることができます。 MySQLには、サーバーと各データベースおよびテーブルのデフォルトの文字セットと照合があります。
一般に、MySQLの文字セットは次のように機能します。
- データベースが作成されると、文字セットはサーバー全体のcharacter_set_server変数から派生します。
- テーブルが作成されると、文字セットはデータベースから取得されます。
- 列が作成されると、文字セットはテーブルから派生します。
文字セットに関する限り、注意が必要な変数がいくつかあります。
- Character_set_clientは、ステートメントがクライアントによって送信される文字セットを定義します。
- Character_set_connectionは、サーバーがクライアントからステートメントを受信した後にステートメントが変換される文字セットを定義します。
- Character_set_resultsは、サーバーがクエリ結果をクライアントに返す文字セットを定義します。
これらの3つの設定は、SETNAMESまたはSETCHARACTER SETステートメントを使用するか、MySQL構成ファイルで変更できます。
文字セットを処理するときに、エラー#1267が発生する場合もあります:
ERROR 1267 (HY000): Illegal mix of collations.
上記のエラーは通常、互換性のない照合がある2つの文字列を比較するか、異なる照合を持つデータを結合された列に選択しようとしたことが原因で発生します。 MySQLが異なる文字セットを持つ2つの値を比較する場合、比較のためにそれらを同じ文字セットに変換する必要があるため、エラーが表示されますが、文字セットには互換性がありません。この問題を解決するには、各テーブルとその列の照合が同じであることを確認してください。
前述のように、照合は文字列の比較と並べ替えの方法を定義する一連のルールであるため、照合は文字セットと密接に関連しています。各文字セットには少なくとも1つの照合があり、一部にはそれ以上の照合があります。
このブログ投稿では、MySQLに関連するすべての照合の詳細については説明しませんが、知っておくべきことがいくつかあります。
- MySQL 5.7を使用している場合、MySQLはデフォルトの文字セットとしてlatin1を使用するため、デフォルトのMySQL照合は通常latin1_swedish_ciです。 MySQL 8.0を使用している場合、デフォルトの文字セットはutf8mb4です。
- UTF-8を照合として使用する場合は、常にutf8mb4(具体的にはutf8mb4_unicode_ci)を使用してください。 MySQLのUTF-8は適切なUTF-8エンコーディングとは異なるため、UTF-8は使用しないでください。これは、データの損失やセキュリティの問題につながる可能性のある完全なUnicodeサポートを提供していないためです。 utf8mb4_general_ciは、速度を向上させるように設計されたショートカットを使用する単純化された並べ替えルールのセットであり、utf8mb4_unicode_ciはさまざまな言語で正確に並べ替えられることに注意してください。一般に、utf8mb4は4バイトのUnicodeもサポートしているのに対し、utf8は最大3つしかサポートしていないため、「最も安全な」文字セットです。
MySQLデータセットに適した照合と文字セットを選択するには、シンプルに保つことを忘れないでください。さまざまな文字セットや(または)照合の混合は、非常に混乱する可能性があるため(たとえば、特定の文字が表示されるまですべてが正常に機能する可能性があるなど)、実際の混乱になる可能性があります。そのため、ニーズを事前に評価して、最適なものを選択することをお勧めします。事前の照合と文字設定。 MySQLには、それを実行するのに役立ついくつかの貴重なクエリもあります。たとえば、
SELECT * FROM information_schema.CHARACTER_SETS ORDER BY CHARACTER_SET_NAME;
は、文字セットと利用可能な照合のリストとその説明を返します。これは、データベース設計を計画している場合に非常に役立ちます。
一部の文字セットでは、より多くのCPU操作が必要になる場合があり、さらに多くのストレージスペースを消費する場合があることに注意してください。間違った文字セットを使用すると、インデックス作成が無効になる可能性があります。たとえば、MySQLは文字セットを変換して、同じでない場合に比較できるようにする必要があります。変換すると、インデックスを使用できなくなる可能性があります。
また、「UTF-8をグローバルに使用する」ことを推奨する人もいることを忘れないでください。多くのアプリケーションはUTF-8をまったく必要としないため、これは必ずしも優れたアイデアではない場合があります。データでは、UTF-8はその価値よりも多くの問題を引き起こす可能性があるため(たとえば、ディスク上ではるかに多くのストレージスペースを使用する可能性があります)、賢明に選択してください。
キャラクターセットと照合は、友達でも悪夢の1つでもかまいません。それは、すべて、それらの使用方法によって異なります。一般に、「適切な」文字セットと照合はデータベースが保持するデータに依存することに注意してください。MySQLは、使用するものを決定するのに役立つクエリを提供しますが、文字セットと照合を効果的にするには、次のことも考慮する必要があります。特定の照合を使用することが理にかなっている場合とその理由について。