MySQLのドキュメントを読むことができます。しかし、どの文字セットを使用するかをどのように決定するのでしょうか?照合はどのデータに影響しますか?
二つの説明と選び方を教えてください。
MySQLのドキュメントを読むことができます。しかし、どの文字セットを使用するかをどのように決定するのでしょうか?照合はどのデータに影響しますか?
二つの説明と選び方を教えてください。
回答:
MySQL docsから:
文字セットは、シンボルとエンコーディングのセットです。照合は、文字セット内の文字を比較するためのルールのセットです。架空の文字セットの例を使用して、区別を明確にしましょう。
「A」、「B」、「a」、「b」の4文字のアルファベットがあるとします。各文字に番号を付けます:「A」= 0、「B」= 1、「a」= 2、「b」=3。文字「A」はシンボル、数字0は「A」のエンコーディング、そして4つすべての文字とそのエンコーディングの組み合わせは文字セットです。
ここで、2つの文字列値「A」と「B」を比較するとします。これを行う最も簡単な方法は、エンコーディングを確認することです。0は「A」、1は「B」です。0は1より小さいため、「A」は「B」より小さいと言います。ここで行ったのは、文字セットに照合順序を適用することです。照合は一連のルール(この場合は1つのルールのみ)です:「エンコードを比較します」。考えられるすべての照合のうち最も単純なものをバイナリ照合と呼びます。
しかし、小文字と大文字が同等であると言いたい場合はどうでしょうか?次に、少なくとも2つのルールがあります。(1)小文字の「a」と「b」を「A」と「B」と同等に扱う (2)次に、エンコーディングを比較します。これを大文字と小文字を区別しない照合と呼びます。バイナリ照合よりも少し複雑です。
実際には、ほとんどの文字セットには多くの文字があります。「A」と「B」だけでなく、アルファベット全体、時には数千の文字を含む複数のアルファベットまたは東洋の書記体系、および多くの特殊記号と句読点があります。また、実生活では、ほとんどの照合に多くのルールがあります。大文字と小文字の区別だけでなく、アクセントの区別もありません(「アクセント」とは、ドイツ語の「ö」のように文字に付けられたマークです)および複数の文字のマッピング(「 ö '= 2つのドイツ語照合のうちの1つでの' OE ')。
文字エンコーディングは、彼らがメモリ内に収まるようにエンコード文字への道です。つまり、文字セットがISO-8859-15の場合、ユーロ記号€は0xa4としてエンコードされ、UTF-8では0xe282acになります。
照合が latin9で、文字を比較する方法であるとして、文字が存在しe é è ê f
、そのバイナリ表現でソートした場合、それは行きます、e f é ê è
しかし、照合は、例えば、フランス語、に設定されている場合、あなたは彼らを考えたために、それらを持っていますすべてのあるであろうe é è ê
等しく、その後f
。
文字セットは、書き込まれたすべてのグリフのサブセットです。文字エンコーディングは、それらの文字が数値にどのようにマッピングされるかを指定します。UTF-8やUTF-16などの一部の文字エンコードでは、ユニバーサル文字セットの任意の文字をエンコードできます。US-ASCIIやISO-8859-1のような他のものは、それぞれ文字あたり7ビットと8ビットを使用するため、小さなサブセットしかエンコードできません。多くの規格では文字セットと文字エンコーディングの両方が指定されているため、「文字セット」という用語は、しばしば「文字エンコーディング」の代わりに自由に使用されます。
照合は、文字を比較してソートする方法を指定するルールで構成されます。照合規則はロケール固有にすることができます。2文字の適切な順序は言語によって異なります。
文字セットと照合順序の選択は、アプリケーションが国際化されているかどうかにかかっています。そうでない場合、どのロケールをターゲットにしていますか?
サポートする文字セットを選択するには、アプリケーションを検討する必要があります。ユーザー提供の入力を保存している場合、ソフトウェアが最終的に使用されるすべてのロケールを予測するのは難しい場合があります。それらすべてをサポートするには、最初からUCS(Unicode)をサポートするのが最善の方法です。ただし、これにはコストがかかります。多くの西ヨーロッパの文字では、文字ごとに1バイトではなく2バイトのストレージが必要になります。
データベースが照合を使用してインデックスを作成し、後でそのインデックスを使用してソートされた結果を提供する場合、正しい照合を選択するとパフォーマンスが向上します。ただし、照合規則は多くの場合ロケール固有であるため、別のロケールの規則に従って結果をソートする必要がある場合、そのインデックスは役に立ちません。
utf8mb4_unicode_ci
並べ替えと比較のためのUnicode標準に基づくを使用することをお勧めします。これは、非常に幅広い言語で正確に並べ替えます。
UTF-8
ます。データベース外のシステムでエンコーディングを使用する場合utf8mb4
、MySQLで使用する場合、データベース内のすべても適切に書き込まれる必要があります。MySQLで特定の文字のテキストをソート、比較、変換する正しい操作に関しては、完璧な解決策を見つけるのは難しい*_unicode_ci
ですが*_general
、確かには優れていますが、欠点もあります。お読みください:dev.mysql.com/doc/refman/8.0/en/charset-unicode-sets.html