みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PHPでMysqlにCSVをインポートす文字化け

お世話になります。

文字化けが解消できずに困っています。

PHPからローカルXAMPPのMYSQLにCSVでデータを上げたいのですが、日本語が文字化けして表示されます。秀丸テキストエディタで可能な限りのエンコードを試しましたが解決できず、サーバ側のエンコード設定も確認しましたがutf8_unicode_ciです。
Mysqlの管理画面のsqlから実行しても同様の結果です。

もう、色々やり過ぎてPHPが悪いのかMysqlサーバの設定なのかCSVの問題なのかわからず途方に暮れています。
諸先輩方でお分かりになられる方がいらっしゃいましたら是非、お知恵を貸してもらえませんか。

PHPのソースです。
------------------------------
$host = "localhost";
$mysql_user = "root";
$mysql_password = "password";
$db = "utsun_db";
$cn = mysql_connect($host,$mysql_user,$mysql_password);
if(!$cn){
die("db connect Error");
}
if(!(mysql_select_db("$db"))){
die("db select error");
}
$file = '"c:/tablea.csv"';
$sql = "LOAD DATA LOCAL INFILE $file INTO TABLE tablea FIELDS TERMINATED BY ',';";
$query = mysql_query($sql);
mysql_close($cn);


-----------------------------
CSVの中身

N551佐々木37
N552伊藤41
N553斉藤31
N554井上43
N555阿倍31


-----------------------------
Mysqlの方ではこのように表示されています

N552
伊藤
41


N553
斉藤
31


N554
井上
43


N555
阿倍
31


ほんとうに困っております宜しくお願いします。

環境
Apache/2.4.3 (Win32) OpenSSL/1.0.1c PHP/5.4.7
phpMyAdmin
バージョン情報: 3.5.2.2, 最終安定バージョン: 4.0.4.1

投稿日時 - 2013-07-11 20:06:55

QNo.8172232

困ってます

質問者が選んだベストアンサー

MySQLのLOAD DATA INFILEにおいては、
character_set_databaseシステム変数の文字コードが使用されます。

おそらくですがxamppでインストールしたMySQLでは、

character_set_database = latin1

が設定されているので、これを変えてあげればいけると思います。
方法としては2つ。


【前提】
・csvファイルの文字コードは「UTF-8」とする。


【方法1】PHPのスクリプト内で設定する。

ご提示いただいたソースで、
-------------------------------------------------------------
$query = mysql_query('set character_set_database=utf8;'); // ←追加

$file = '"c:/tablea.csv"';
$sql = "LOAD DATA LOCAL INFILE $file INTO TABLE tablea FIELDS TERMINATED BY ',';";
$query = mysql_query($sql);
mysql_close($cn);
-------------------------------------------------------------
の「set character_set_database=utf8;」を実行する1行を、
「LOAD DATA LOCAL INFILE」でデータを取り込む前に実行してあげる。


【方法2】MySQLの設定を変更する。

MySQLの設定ファイル
c:\xampp\mysql\bin\my.ini
(適宜ご自分の環境に置き換えてください。)
に、
-------------------------------------------------------------
# [client]ブロックに下記の行を追加する
default-character-set=utf8

# [mysqld]ブロックに下記の行を追加する
character-set-server=utf8
skip-character-set-client-handshake
-------------------------------------------------------------
を追記して、MySQLを再起動して、PHPを実行する。
(こちらの場合はソースの変更はいらないかと思います。)

【参考サイト】
http://1000g.5qk.jp/2010/11/04/xampp%E3%81%AEmysql%E3%81%A7%E6%AD%A3%E3%81%97%E3%81%8Futf-8%E3%82%92%E4%BD%BF%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B/

のどちらかの方法で、いけるかと思いますので、
ご確認いただけますでしょうか?

よろしくお願いします!

参考URL:http://www.softel.co.jp/blogs/tech/archives/2293

投稿日時 - 2013-07-12 10:07:57

お礼

最初のやり方で解決しました!ありがとうございます。
なんとお礼を言っていいやら、涙がちょちょぎれています。
やっと足踏みから解放されました本当に助かりました。
重ねてありがとうございました。

投稿日時 - 2013-07-12 10:49:54

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問