SELECT結果がなんかおかしかった
テーブル(仮)
id | name |
---|---|
1 | テスト |
2 | テスト |
3 | てすと |
3 | test |
SELECT * FROM test WHERE name = 'テスト';
id | name |
---|---|
1 | テスト |
2 | テスト |
3 | てすと |
WHEREって完全一致だと思ってたので、ひらがな/カタカナが区別されていないことに動揺。
調べてみるとCollationの設定が関係しているらしい??
MySQLを使って2年目で初めてCollationというものを知りました(それまでは気にしたことがなかった)
Collationとは
各データベースにはデータベース文字セットとデータベース照合順序があります。
ここでいうデータベース照合順序がCollationのことで、
データに含まれるの文字を比較するときにどの文字を区別してどの文字を同じものと見なすか?という設定のようなもの(らしい)
サーバレベル、データベースレベル、テーブルレベル、カラムレベルそれぞれで設定できる(らしい)
じゃあ今のCollationを確認してみます
Collationの確認方法
データベース
SELECT @@character_set_database, @@collation_database;
テーブル
show table status from [DB名];
カラム
SHOW FULL COLUMNS FROM test;
上記のテーブルはutf8mb4_unicode_ci
になっていました。(だからSELECT結果がおかしく見えた)
区別したいのでutf8_general_ci
に変更してみます
Collationの変更方法
データベース
ALTER DATABASE COLLATE [照合順序];
テーブル
ALTER TABLE [テーブル名] COLLATE [照合順序];
カラム
ALTER TABLE [テーブル名] MODIFY COLUMN [カラム名] [型] COLLATE [照合順序];
結果
SELECT * FROM test WHERE name = 'テスト';
id | name |
---|---|
1 | テスト |
欲しかった挙動になりました(とりあえずめでたしめでたし)
Collationについて理解しきれてないところがあるのでちゃんと調査・理解できたら後ほど追記などします