takafumi blog

日々の勉強メモ

MySQL/MariaDB 文字コードの破壊と文字化け対策

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



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

文字コードの破壊例と対策

1) SQLの結果を表示する際は表示文字コード(character_set_results)が「latin1」

「latin1」ではマルチバイト文字を利用できないので、全てのマルチバイト文字は破壊される。

2) ターミナルとクライアント文字コード設定が異なっている

DBに接続するターミナル(PuTTY,TeraTermなど)と、表示の文字コード(character_set_results)が異なると、文字破壊が発生し文字化けする。
ちなみにどちらもマルチバイト文字を扱える文字コードであれば、

mysql > pager nkf -w 

のようにpagerにnkfを設定すると一時的に正常に表示できる。
上記"nkf -w "はターミナル設定がutf8のとき。

mysql > SET NAMES utf8

でももちろん問題ない。

3) "LOAD DATA INFILE"文の文字コード

この時はDBの文字コード(character_set_database)が利用される。

4) リダイレクトを使った取り込み

クライアント=>サーバーの文字コード(character_set_client)が一致するようにする。
sqlファイルに"SET NAMES"を書くのも有効。

5) プログラムからSQLを実行するとき

これも、クライアント=>サーバーの文字コード(character_set_client)が一致するようにする。
sqlファイルに"SET NAMES"を書くのも有効。


※ 勘違いしやすい(というか自分でしていた)が、ターミナルとサーバー側の文字コードが異なっていても、クライアントも文字コード設定が合っている場合は、文字化けは発生しない・・・と思う