Hatena::ブログ(Diary)

AmidaikeBlog このページをアンテナに追加 RSSフィード

2009-11-20

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

今回のプロジェクトは萌えるプロジェクトだ。

という訳で、照合順序とは何か前から気になっていたので調べました。

今までは何の意識する事も無くデフォルトで使っていたので。。。

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


以下のMySQLURLを参考に抜粋していきましょう。

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バイト必要なわけです。

MySQLCHAR(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のままで行きます。


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


ちなみに、データ登録時に桁数を超えたときの対処方法は、

MySQL :: Page Not Found

です。

これは設定しておかないとまずいな。

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/amidaike/20091120/1261065104
リンク元
Connection: close