はじめに
テーブルを作るときに照合順序の指定を間違えて、期待したことができず混乱したのでメモ。
経緯
mysqlテーブルを使って一種のバージョン管理を行うため、比較条件の厳しいutf8_binを使おうとしたら照合順序がテーブルに反映されなかった。
期待する結果
テーブルを作成する時、データベースに設定された照合順序に合わせて文字コードなどが指定されること。
SQL文を色々試してみた。
正しいSQL文
文字コードと照合順序を正しく指定したSQL文を処理させてみる。
正しいSQL文
create `database name`.`table name` (
column_name data_type ( number )
column_name data_type ( number )
) character set utf8 collate utf8-bin;
結果、文字コードと照合順序を正しく指定しているため、想定通りのテーブルとなる。
文字コードだけ指定したSQL文
文字コードは正しく指定するが、照合順序を指定していないSQL文を処理させてみる。
指定された文字コードをもとにinformation_schema.character_setに対応したis_default=yesの照合順序から取ってくる
create `database name`.`table name` (
column_name data_type ( number )
column_name data_type ( number )
) charset set utf8;
結果、作成されるテーブルの照合順序は思い通りになるとは限らない。
文字コードも照合順序も省いたSQL文
文字コードと照合順序を指定しないSQL文を処理させてみる。
データベースに設定されている文字コードと照合順序を持ってくる
create `database name`.`table name` (
column_name data_type ( number )
column_name data_type ( number )
);
結論
当たり前のことだけど、SQL文をテキトーに書くと思った挙動にならないので注意が必要。