質問: いつもお世話になっております。 ネット上のサイトにて拝見致しました以下のphpファイルの記述を元に、ローカル上で作成したエクセルのcsvファイルをサーバーのmysqlへインポートするとエクセル上でタイプした時点では日本語は当然のことながら問題なく表示されておりますし、データ自体もインポートされますが、mysql上で日本語が文字化けしてしまいます。 どのようにすれば文字化けせずにインポートできるかお教え願いませんでしょうか?(英語は問題ないと思われますが、他の言語も文字化けしないような設定方法をお教えいたただければ有難いです。) ``` ``` Plesk バージョン: 17.0.17 構成名: Plesk 12 Web Admin for Linux PHP: 5.3.3 OS: CentOS 6.9 MySQL:5.1.73 エクセル2010
回答: DBを用いるプログラムでエンコーディングがずれる可能性があるのは次の通りです 1. そもそも元データが思っているのと違う 2. データとプログラム内部のずれ 3. DBへの接続時のエンコーディング 4. DBのエンコーディング 上記のプログラムでは、元データはおそらくShiftJISですが、プログラムでUTF-8に変換されています。DBへの接続時のエンコーディングは指定されていません。またDBのエンコーディングも不明です。 DBへの接続時のエンコーディングは、Webサーバが起動された環境のロケールがデフォルトになります。DBのエンコーディングは作成時に指定しますが多分Latin1になっていると思います。 ということで、 ・DBが適切なエンコーディングになっているか確認する。なっていなければ作り直す ・DB接続時に適切なエンコーディングを指定する 必要があります。 書かれたプログラムにはそれ以前に * もはや太古の遺物である`mysql_*`系の関数が使われています。 * 典型的なSQLインジェクション脆弱性があります。 といった根本的な問題があり、全面的に書き直す必要があります。 しかし、PHPとMySQLについてこのあたりを「正確に」説明している資料はかなり希です。Webで見つかるものは大抵間違っています。 信頼できる資料として、「体系的に学ぶ 安全なWebアプリケーションの作り方 第2版」という書籍を紹介しておきます。作り直す前に一読されることをお勧めします。