web-dev-qa-db-ja.com

UTF-8:一般?ビン? Unicode?

さまざまな種類のデータにどの照合を使用する必要があるかを把握しようとしています。保存するコンテンツの100%はユーザーが送信したものです。

私の理解では、UTF-8バイナリの代わりにUTF-8 General CI(大文字と小文字を区別しない)を使用する必要があります。ただし、UTF-8 General CIとUTF-8 Unicode CIの違いを明確に見つけることはできません。

  1. ユーザーが送信したコンテンツをUTF-8 GeneralまたはUTF-8 Unicode CI列に保存する必要がありますか?
  2. UTF-8バイナリはどのタイプのデータに適用できますか?
270
Dolph

一般に、utf8_general_ciutf8_unicode_ciより高速ですが、あまり正確ではありません。

違いは次のとおりです。

Unicode文字セットの場合、_general_ci照合を使用して実行される操作は、_unicode_ci照合の操作よりも高速です。たとえば、utf8_general_ci照合順序の比較は、utf8_unicode_ciの比較よりも高速ですが、わずかに正しくありません。これは、utf8_unicode_ciが展開などのマッピングをサポートしているためです。つまり、1つの文字が他の文字の組み合わせと等しいと比較される場合。たとえば、ドイツ語および他のいくつかの言語では、「ß」は「ss」と同じです。 utf8_unicode_ciは、収縮と無視可能な文字もサポートします。 utf8_general_ciは、拡張、縮小、または無視可能な文字をサポートしないレガシー照合です。文字間で1対1の比較のみを行うことができます。

引用元: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

詳細については、MySQLフォーラムの次の投稿を参照してください。 http://forums.mysql.com/read.php?103,187048,188748

Utf8_binの場合:utf8_general_ciおよびutf8_unicode_ciは、大文字と小文字を区別しない比較を実行します。 constrastでは、utf8_binは大文字と小文字を区別します(他の違いの中でも)、文字のバイナリ値を比較するためです。

289
Sagi

また、varcharフィールドを一意またはプライマリインデックスとして使用する場合、utf8_general_ciを使用して「a」や「á」などの2つの値を挿入すると、重複キーエラーが発生することに注意してください。

87
Alex Hepp
  • utf8_binはビットを盲目的に比較します。ケースの折り畳み、アクセントの除去はありません。
  • utf8_general_ciは、1バイトと1バイトを比較します。大文字の折りたたみandアクセント除去を行いますが、2文字の比較はありません:この照合ではijijと等しくありません。
  • utf8_*_ciは言語固有のルールのセットですが、それ以外はunicode_ciに似ています。特別な場合:ÇČchll
  • utf8_unicode_ciは、比較のために古いUnicode標準に従います。 ij = ij、ただしae!= æ
  • utf8_unicode_520_ciは、より新しいUnicode標準に従います。 ae = æ

さまざまなutf8照合の内容と同等の詳細については、 照合チャート を参照してください。

utf8MySQLで定義されているようには1バイトから3バイトのutf8コードに制限されています。これにより、絵文字と一部の中国語が除外されます。したがって、ヨーロッパをはるかに超えたい場合は、本当にutf8mb4に切り替える必要があります。

上記の点は、適切なスペルの変更後、utf8mb4に適用されます。今後は、utf8mb4utf8mb4_unicode_520_ciが推奨されます。

  • utf16とutf32はutf8のバリアントです。それらは事実上使用できません。
  • ucs2は「utf8」よりも「Unicode」に近い。実質的には使用できません。
26
Rick James

実際、uniqueインデックスを持つ列に 'é'や 'e'のような値を保存することをテストしましたが、 'utf8_unicode_ci'と 'utf8_general_ciの両方で重複エラーが発生します'。それらは「utf8_bin」照合列にのみ保存できます。

また、mysql docs( http://dev.mysql.com/doc/refman/5.7/en/charset-applications.html にあります)は、その例に 'utf8_general_ci'照合を設定することを提案しています。

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
6
vitalii

受け入れられた答えは時代遅れです。

MySQL 5.5.3以降を使用する場合は、utf8mb4_unicode_ciの代わりにutf8_unicode_ciを使用して、ユーザーが入力した文字がエラーにならないようにします。

utf8mb4は、たとえば絵文字をサポートしますが、utf8は次のようなエンコーディング関連のバグを何百も提供する可能性があります。

Incorrect string value: ‘\xF0\x9F\x98\x81…’ for column ‘data’ at row 1

2
Marwann