環境 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"を書くのも有効。
※ 勘違いしやすい(というか自分でしていた)が、ターミナルとサーバー側の文字コードが異なっていても、クライアントも文字コード設定が合っている場合は、文字化けは発生しない・・・と思う