MySQLの照合順序とは何ぞや?

今回のプロジェクトは萌えるプロジェクトだ。
という訳で、照合順序とは何か前から気になっていたので調べました。
今までは何の意識する事も無くデフォルトで使っていたので。。。

ちなみに何度も書きますがOSはCentOS5.4、MySQLは5.1.40です。


以下のMySQLのURLを参考に抜粋していきましょう。
MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.1 一般の文字セットおよび照合順序


照合順序とは、その名の通り照合する順番の事なんですね。
で、国ごとで文字の扱いが異なるから一杯文字キャラクター定義されているという訳ですね。
何だそのまんまで簡単じゃん。


create database hogehoge default character set utf8;

というように今回データベースはutf8を使うのでデフォルトだとutf8が使われてます。
SHOW TABLE STATUS;
と実行すると、、、
ん、各テーブルにあるutf8_general_ciて何だという事で更に確認。


MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.2 MySQL での文字セットと照合順序

照合順序名には次の規則が適用されます。関連するキャラクタセットの名前で始まる。
通常は言語名が含まれており、_ci (大文字と小文字が区別されない)、_cs (大文字と小文字が区別される)、_bin (バイナリ)のいずれかで終わる。

という事で、順序には大文字と小文字は意識しないらしい。20へぇ。


で、照合順序はデータベース全体、テーブル全体、カラムというように細かい設定が可能という事ですね。
データベース作成時にutf8を指定しないと、確かlatin1が設定された筈。


じゃあutf8_generalがデフォルトなのかというと、
SHOW CHARACTER SET;
を実行すると、

                                                                                                                                                • +
Charset Description Default collation Maxlen
                                                                                                                                                • +
utf8 UTF-8 Unicode utf8_general_ci 3

なるほど、確かにutf8_general_ciがデフォルトというようになっとるわけですね。


Maxlenカラムとは、
MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.10 Unicode のサポート
にあるように1文字を格納するのに必要な最大バイト数という事なので、
3バイト必要なわけです。

MySQLはCHAR(10) CHARACTER SET utf8カラムに対して30バイトを確保しなければなりません。

だってさ。変なの。


あと、utf8_general_ciで良いのかというと、
MySQL :: MySQL 5.6 リファレンスマニュアル :: 10.1.14.1 Unicode 文字セット
にあるように

utf8_general_ciは拡張をサポートしないレガシー照合順序です。文字間で1対1の比較しかできません。つまり、utf8_general_ci照合順序に対する比較の方が早いが、utf8_unicode_ciに比べてわずかに正確性が劣ります。

らしいです。

今回は影響範囲が無いだろうという事なのでこのままutf8_general_ciのままで行きます。


昔から気になってた事がやっとスッキリしたという感じ。


ちなみに、データ登録時に桁数を超えたときの対処方法は、
http://dev.mysql.com/doc/refman/5.1/ja/server-sql-mode.html
です。
これは設定しておかないとまずいな。

忘れないうちに設定しておこう。