さまざまな種類のデータにどの照合を使用する必要があるかを把握しようとしています。保存するコンテンツの100%はユーザーが送信したものです。
私の理解では、UTF-8バイナリの代わりにUTF-8 General CI(大文字と小文字を区別しない)を使用する必要があります。ただし、UTF-8 General CIとUTF-8 Unicode CIの違いを明確に見つけることはできません。
一般に、utf8_general_ciはutf8_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は大文字と小文字を区別します(他の違いの中でも)、文字のバイナリ値を比較するためです。
また、varcharフィールドを一意またはプライマリインデックスとして使用する場合、utf8_general_ciを使用して「a」や「á」などの2つの値を挿入すると、重複キーエラーが発生することに注意してください。
utf8_bin
はビットを盲目的に比較します。ケースの折り畳み、アクセントの除去はありません。utf8_general_ci
は、1バイトと1バイトを比較します。大文字の折りたたみandアクセント除去を行いますが、2文字の比較はありません:この照合ではij
はij
と等しくありません。utf8_*_ci
は言語固有のルールのセットですが、それ以外はunicode_ci
に似ています。特別な場合:Ç
、Č
、ch
、ll
utf8_unicode_ci
は、比較のために古いUnicode標準に従います。 ij
= ij
、ただしae
!= æ
utf8_unicode_520_ci
は、より新しいUnicode標準に従います。 ae
= æ
さまざまなutf8照合の内容と同等の詳細については、 照合チャート を参照してください。
utf8
、MySQLで定義されているようには1バイトから3バイトのutf8コードに制限されています。これにより、絵文字と一部の中国語が除外されます。したがって、ヨーロッパをはるかに超えたい場合は、本当にutf8mb4
に切り替える必要があります。
上記の点は、適切なスペルの変更後、utf8mb4
に適用されます。今後は、utf8mb4
とutf8mb4_unicode_520_ci
が推奨されます。
実際、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
受け入れられた答えは時代遅れです。
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