文字コードが異なれば、同じ文字であっても異なる値が割り当てられます。例えば、全角の「あ」はシフトJISでは「0x82A0」ですが、UTF-8では「0xE38182」です。そのため、文字コードの指定に不備があると文字化けが発生します。
目次
クライアントとサーバー
MySQLでは、クライアント文字コード、サーバー文字コードを別々に設定します。
文字コード指定単位 | 役割 |
---|---|
クライアント文字コード | クライアントがデータの送受信に使用する文字コード |
サーバー文字コード | 文字データを内部的に表現するための文字コード |
クライアント側、サーバ側で異なる文字コードを指定している場合、MySQLの機能により文字コードの変換処理が行われます。
文字コードの確認
設定されている文字コードは、下記のSQL文で確認できます。
mysql> SHOW VARIABLES LIKE 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
クライアント文字コードの設定
クライアント文字コードをutf8にしたい場合、/etc/my.cnf
に下記指定を行います。
[mysql]
default-character-set=utf8
SQLでも設定可能です。下記どちらかのSQLを実施します。
/* 指定方法1 */
SET NAMES utf8
/* 指定方法2 */
SET CHARACTER SET utf8
サーバ文字コードの設定
インスタンス
データベース
テーブル
列
の4種類のレベルで文字コードを指定できます。
列の文字コードが指定されていなければ、テーブルの文字コード。
テーブルの文字コードが指定されていなければ、データベースの文字コード。
データベースの文字コードもしてされていなければ、インスタンスの文字コードが割り当てられます。
優先順位 | レベル | 設定方法 |
---|---|---|
1 | 列 | CREATE / ALTER TABLE文で指定 |
2 | テーブル | CREATE / ALTER TABLE文で指定 |
3 | データベース | CREATE / ALTER DATABASE文で指定 |
4 | インスタンス | 初期化パラメータdefault-character-set で指定 |