web-dev-qa-db-ja.com

文字セットと照合は正確に何を意味しますか?

MySQLのドキュメントを読むことができ、それはかなり明確です。しかし、どの文字セットを使用するかをどのように決定しますか?照合はどのデータに影響しますか?

私は2つの説明とそれらを選択する方法を求めています。

290
Sander Versluys

MySQLから docs

文字セットは、シンボルとエンコーディングのセットです。 collat​​ionは、文字セット内の文字を比較するための一連のルールです。想像上の文字セットの例で区別を明確にしましょう。

「A」、「B」、「a」、「b」の4文字のアルファベットがあるとします。各文字に数字を付けます:「A」= 0、「B」= 1、「a」= 2、「b」=3。文字「A」は記号で、数字0は「A」のエンコードです。 、および4文字すべてとそのエンコードの組み合わせが文字セットです。

ここで、2つの文字列値「A」と「B」を比較するとします。これを行う最も簡単な方法は、エンコードを確認することです。「A」の場合は0、「B」の場合は1です。 0は1より小さいので、「A」は「B」より小さいと言います。さて、今やったことは、照合を文字セットに適用することです。照合は一連のルールです(この場合は1つのルールのみ):「エンコードを比較します」可能なすべての照合のうち、この最も単純な照合をバイナリ照合と呼びます。

しかし、小文字と大文字が同等であると言いたい場合はどうでしょうか?次に、少なくとも2つのルールがあります。(1)小文字の「a」と「b」を「A」と「B」に相当するものとして扱います。 (2)次に、エンコードを比較します。これを大文字と小文字を区別しない照合と呼びます。バイナリ照合よりも少し複雑です。

実際には、ほとんどの文字セットには多くの文字があります。「A」と「B」だけでなく、アルファベット全体、時には複数のアルファベット、または数千の文字を含む東洋の書記体系に加えて、多くの特殊記号と句読点があります。また、実際の生活では、ほとんどの照合には多くのルールがあります。大文字と小文字を区別しないだけでなく、アクセントを区別しない(「アクセント」はドイツ語の 'ö'のように文字に付けられるマークです)および複数文字のマッピング( ' ö '=' OE '、2つのドイツ語照合の1つ)。

480
Dan Esparza

文字エンコーディング は、文字をメモリに収まるようにエンコードする方法です。つまり、文字セットがISO-8859-15である場合、ユーロ記号€は0xa4としてエンコードされ、UTF-8では0xe282acになります。

照合 は、文字を比較する方法です。latin9では、e é è ê fのような文字があります。バイナリ表現で並べ替えると、e f é ê èになりますが、照合がたとえばフランス語に設定されている場合、それらをあなたが思うだろうと思う順序で持ってください。それはすべてのe é è êが等しい、そしてfです。

192
mat

文字セットは、書かれたすべてのグリフのサブセットです。文字エンコードは、それらの文字を数値にマップする方法を指定します。 UTF-8やUTF-16などの一部の文字エンコードは、ユニバーサル文字セットの任意の文字をエンコードできます。 US-ASCIIやISO-8859-1のようなその他のものは、文字ごとにそれぞれ7ビットと8ビットを使用するため、小さなサブセットのみをエンコードできます。多くの標準では文字セットと文字エンコーディングの両方が指定されているため、「文字セット」という用語は「文字エンコーディング」の代わりに自由に使用されることがよくあります。

照合は、ソートのために文字を比較する方法を指定するルールで構成されます。照合規則はロケール固有にすることができます。2文字の適切な順序は言語によって異なります。

文字セットと照合の選択は、アプリケーションが国際化されているかどうかによって決まります。そうでない場合、どのロケールをターゲットにしていますか?

サポートする文字セットを選択するには、アプリケーションを検討する必要があります。ユーザー提供の入力を保存している場合、最終的にソフトウェアが使用されるすべてのロケールを予測するのは難しいかもしれません。それらすべてをサポートするには、最初からUCS(Unicode)をサポートするのが最善かもしれません。ただし、これにはコストがかかります。多くの西ヨーロッパ文字は、1文字ではなく文字ごとに2バイトのストレージを必要とします。

適切な照合を選択すると、データベースが照合を使用してインデックスを作成し、後でそのインデックスを使用してソートされた結果を提供する場合にパフォーマンスが向上します。ただし、照合規則は多くの場合ロケール固有であるため、別のロケールの規則に従って結果をソートする必要がある場合、そのインデックスは価値がありません。

20
erickson

utf8mb4_unicode_ciを使用することをお勧めします。これは、並べ替えと比較のためのUnicode標準に基づいており、非常に広範な言語で正確に並べ替えます。

3
simhumileco