MySQL、DBの文字セット

Read More

MySQLです


昨今はどのシステムもUTF-8で作ることが多くなってきました。

そしてMySQLには用途に合わせて使い分けれるよう照合順序(COLLATE)用のものが用意されています。


以下のような特徴があります。
■utf8_bin
検索条件の比較において内部的にバイナリデータで比較を行う。
この為英字の大文字小文字も厳格に区別してくれる。
3つの中で最も高速に動作する。

■utf8_general_ci
検索条件の比較において英字の大文字小文字の区別をしない。
つまりaaaとAAAは(もちろんAaaも)同一と見なす。
3つの中では中速。

■utf8_unicode_ci
検索条件の比較において英字の大文字小文字を区別しない。
加えて日本語のひらがな、全角カナ、半角カナ、濁点、半濁点なども同時に検索する。
つまり"ほ"という条件に対して、
"ぼ"、"ぽ"、"ホ(全角)"、"ボ(全角)"、"ポ(全角)"、
"ホ(半角)"、"ボ(半角)"、"ポ(半角)"がヒットする。
3つの中では最も低速。



それぞれ使いどころが違うかと思いますが、一般的に標準とされているのはその名の通りutf8_general_ciです。


ただ上記に書いてある通り英字の大文字小文字を区別しないので、
ログイン時などで問題となる可能性があります。


--
これに対応する方法はいくつかあります。


まず1つ目は検索条件に型でBINARYを指定する方法です。
SELECT * FROM テーブル名 WHERE BINARY login = POST値;


ちなみに型の指定にはこんな記述方法もあります。
SELECT * FROM テーブル名 WHERE user_name COLLATE utf8_unicode_ci = POST値;




そして2つ目はテーブル作成時にBINARY指定しておく方法です。
ALTER TABLE テーブル名 MODIFY login varchar (24) BINARY NOT NULL; 

BINARY指定をするとそのカラムのみ照合順序にutf8_binが指定されることになります。


--
セキュリティホールのことを考えれる人はutf8_general_ci、uft8_unicode_ui、
分からない人はutf8_binを使うようにしましょう。




-- 2016/11/18 一部修正
型の指定方法でCOLLATEを使った例を追加。