文字コードの確認と設定方法

文字コードが異なれば、同じ文字であっても異なる値が割り当てられます。例えば、全角の「あ」はシフト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 で指定
わくわくBank.
フリーランスのエンジニアとして活動してます。ここでは、ソフトウェア開発で必要とされる技術、用語、概念を整理しています。