takafumi blog

日々の勉強メモ

MySQL/MariaDB 文字コードの自動変換

環境   CentOS 7.0 MariaDB 5.6
※ここで使用しているのはMariaDBだが、設定はほぼ同じなのでMySQLとして扱う。



文字コードに関する記事
MySQL/MariaDB 文字コードの自動変換
MySQL/MariaDB 文字コードの設定
MySQL/MariaDB 文字コードの破壊と文字化け対策
MySQL/MariaDB サーバー文字コードの優先度

文字コード自動変換について

MySQLはクライアントとサーバーでメッセージをやりとりする際に、サーバー側で文字コードを変換する。
例えばサーバーがEUC-JP(ujis)、クライアントがUTF8とすると、
・クライアント => サーバー :SQLを送る場合

UTF8 -(変換)-> Unicode -(変換)-> EUC-JP

・サーバー => クライアント :結果を返すとき

EUC-JP -(変換)-> Unicode -(変換)-> UTF8

と一度Unicode文字コードを変換して*1 *2、それぞれの文字コードに変換する。

この文字コードの設定が間違っていると、文字化けが発生する。

この自動変換を無効化するには、
a) サーバーとクライアントの文字コードを一致させる
b) キャラセットを「binary」にすることで、自動変換をキャンセルする。
ただしbinaryはsjis,cp932(Microsoft定義のsjis)の文字コードを破壊することがあるので注意の必要がある。

*1:mysql5.5未満はUnicodeBMP(Basic Multilingual Plane)なので、この範囲を越える文字は文字化けする。

*2:BMP(Basic Multilingual Plane): 基本多言語面 - Wikipedia