Q.データベースの内容が文字化けが発生します。
弊社レンタルサーバサービスでは、MySQLデータベースを使ったWebアプリケーションなどで、文字化け問題が発生しづらいようにチューニングを施しておりますが、それでも、設定次第では文字化けが発生してしまう可能性があります。そこで、文字化けを発生させないためのポイントをご紹介いたします。
データベース内の文字コードとWebアプリケーションの文字コードを合わせる
通常、Webアプリケーションでは「クライアント(ブラウザなど)の文字コード」「サーバー(PHPなど)の文字コード」「データベースの文字コード」と、独自に文字コードの設定を持っていますが、3つの文字コードがバラバラだとデータの受け渡しの際に文字コード変換処理を挟む必要があるため文字化けが発生しやすくなります。Webアプリケーションを開発する際には、3つの文字コードが同じとなるように気をつけましょう。
文字コード変換が必要なときは適切に変換されるように「SET NAMES」構文を指定する
WebアプリケーションからMySQLデータベースへデータを格納するとき、どうしても文字コード変換処理が必要な場合は、下記を参考に「Webアプリケーション」「MySQLデータベース」の文字コード変換処理が適切に行われるようにしましょう。
Webアプリケーション の文字コード |
MySQLデータベース の文字コード |
「SET NAMES」構文 | 変換処理 | 文字化け |
UTF-8 | binary | 指定なし | 変換なし | 文字化けなし |
UTF-8 | UTF-8 | 指定なし | 変換なし | 文字化けなし |
EUC-JP | UTF-8 | 指定なし | 変換なし | 文字化けなし |
EUC-JP | UTF-8 | SET NAMES ujis | 変換あり | 文字化けなし |
EUC-JP | UTF-8 | SET NAMES utf8 | 変換あり | 文字化け発生 |
MySQLデータベース内の文字コード(テーブル/カラム)に「シフトJIS」を指定しない
SQLでは、値(文字)として[‘(シングルクォート)」「”(ダブルクォート)」を使う場合、値(文字)の前にエスケープ文字「\(ASCIIコードで0x5C)」をつけて記述します。その場合、MySQLデータベースでは、データらエスケープ文字を撤去して格納します。
シフトJISには、「表(ASCIIコード:0x955C)」や「ソ(ASCIIコード:0x835C)」など、2バイト目がエスケープ文字「\(ASCIIコード:0x5C)」と同じコードを含む文字があるため、MySQLデータベース内の文字コードとして「シフトJIS」を指定していると、2バイト目の「0x5C」が取り除かれて文字化けが発生してしまいます。
これは、「シフトJIS」だけに発生する問題なので、MySQLデータベース内の文字コードとしてなるべく「シフトJIS」を指定しないようにしましょう。
文字コードの変換が必要な場合には扱える文字範囲に注意する
文字コードの変換を行った際、それぞれの文字コードで対応している文字情報が異なるため、変換前の文字を変換後の文字コードで表示できるとは限りません。そのため、文字コード変換が必要なWebアプリケーションでは、変換前の文字コード、変換後の文字コードで扱える文字範囲に注意をする必要があります。