MySQLの文字セットと照合順序
MySQLでは、データベース、テーブル、カラムのそれぞれに対して文字セットと照合順序を設定できる。
文字セット
- 用語
-- MySQLで設定可能な文字セットの一覧 show character set; -- MySQLの設定 -- 出力結果の変数の意味は下記 show variables like '%char%'; -- DBの設定を確認する show create database #{db_name}; -- 出力例 -- CREATE DATABASE /*!32312 IF NOT EXISTS*/ `my-db` /*!40100 DEFAULT CHARACTER SET utf8 */; -- /*!32312 xxxx */ は MySQLの拡張コメント。MySQL 3.23.12 以降のサーバーでのみ実行の意味 -- テーブルの設定を確認する show crate table #{table_name};
- 文字セットに関する変数
- character_set_client:
- クライアントから送られるステートメントは
character_set_client
の文字セットとして扱う
- クライアントから送られるステートメントは
- character_set_connection:
- クライアントから受け取ったステートメントは、
character_set_client
からcharacter_set_connection
の文字セットに変換される。
- クライアントから受け取ったステートメントは、
- character_set_results:
- サーバがクライアントに返すときは
character_set_results
の文字セットに変換される
- サーバがクライアントに返すときは
- character_set_database:
- デフォルトデータベースで使用される文字セット
- デフォルトデータベース=USE文で指定したデータベースのこと
- character_set_server:
- デフォルトの文字セット
- character_set_filesystem:
- ファイルシステムの文字セット
- character_set_system:
- 識別子を保存するための文字コード?
- 常にutf8らしい
- character_sets_dir:
- 文字セットを扱うために必要なファイルがあるディレクトリ
- character_set_client:
照合順序
- 値を並び替えするときや比較するときのルール
- 大文字と小文字を区別するかどうかなど
- 照合順序が異なるカラムで比較するとエラーする(比較ルールが異なるため)
- 文字セットごとに照合順序が用意されている
- 例:
-- UTF8で使える照合順序の確認 show collation where charset = 'utf8'; -- DB単位での確認&変更 SELECT @@character_set_database, @@collation_database; ALTER DATABASE COLLATE 'utf8_general_ci'; -- テーブル単位での確認&変更 SHOW TABLE STATUS FROM #{TABLE_NAME}; ALTER TABLE #{TABLE_NAME} COLLATE 'utf8_general_ci';
/etc/my.cnf
の設定
# MySQLサーバの設定 [mysqld] character-set-server = utf8 collation-server = utf8_general_ci # mysqldump用の設定 [mysqldump] default-character-set = utf8 # MySQLクライアントの設定 # [client]でもOK # # default-character-setの値に以下の変数が従属する # - character_set_client # - character_set_connection # - character_set_results [mysql] default-character-set = utf8