キャラクタセットと照合順序について

キャラクタセットとは、シンボルとエンコードのセットです。照合順序とは、キャラクタセット内の文字を比較するためのルールを集めたものです。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.1 一般の文字セットおよび照合順序

‘A’ = 0、‘B’ = 1、‘a’ = 2、‘b’ = 3

上記のような場合を考える。

‘A’ シンボル
0 エンコードされた‘A’
‘A’ = 0、‘B’ = 1、‘a’ = 2、‘b’ = 3 キャラクタセット

となる。

MySQLサーバでは、複数のキャラクタセットが使用可能。

SHOW CHARACTER SET;

でリストアップできる。

照合順序とは、文字列に関する並び替えや比較方法に関する規則である。'a' が 'A' の小文字であることは人間には自明であるが、機械にとってはそうではなく、何かしらの方法で教えてあげないといけない。

"abc".upcase => "ABC"

というRubyのコードも照合順序が可能にしているのだろう。MySQLではキャラクタセットには少なくとも1つの照合順序が含まれているが、複数の照合順序が含まれていることもある。

SHOW COLLATION LIKE 'utf8%';

の場合、utf8の照合順序を調べることが出来る。照合順序の名称は一定のルールに基づいている。キャラクタセット名で始まり、大体は言語名を含み、末尾は以下のとおりである。例えば、 utf8_general_ci のような感じである。

_ci 大文字と小文字が区別されない(Case In-sensitive)
_cs 大文字と小文字が区別される(Case Sensitive)
_bin バイナリ(結果的に大文字と小文字が区別される)

メールアドレスやIDは、大文字と小文字を区別しないCase Insensitiveにするのがベターである。
abcde@example.com と ABCDE@EXAPLE.COM が別物だと区別され登録されてしまうため。