\copyコマンドでのCSV取り込みの文字化け

このQ&Aのポイント
  • WindowのExcelでCSVをPostgreSQLのCOPYコマンドでインポートする際に、EUC-JPの文字化け問題が発生している。
  • デフォルトのDBのエンコードをEUC-JPに設定しているが、SELECTの結果が文字化けしないようにしたい。
  • どこか間違っている箇所があるのか、正しい設定方法を教えてほしい。
回答を見る
  • ベストアンサー

\copyコマンドでのCSV取り込みの文字化け

いつもお世話になっております。 前提として、環境は、VMWareの中に、CentOS5があり、PostgreSQL8.4で、 文字コードはEUC-JPをinitdbしています。 今回、WindowのExcelでCSVを、PostgreSQLのCOPYコマンドでインポートできるかを検証しているのですが、下記のような形で、copyコマンドを実行しますと、 結果、UTF-8ですと、文字化けしていませんが、EUC-JPですと、文字化けしてしまいます。 デフォルトのDBのエンコードのEUC-JPで、SELECTの結果が文字化けしてほしくないのですが、どこか、間違っているところありますでしょうか。 お手数をおかけしますが、なにとぞご教授よろしくお願い申し上げます。 [foo@localhost ~]$ psql test psql (8.4.6) Type "help" for help. test=> \encoding SHIFT-JIS test=> \copy shinamono from /tmp/Book1.csv with csv test=> select * from shinamono; hinmei | nedan ---------------------+------- ・スンゑソス・ス・ス | 100 ・ス・ス・ス・ス・ス・ス | 150 ・ス・ス・ス・ス・ス・ス | 2500 ・ス`・ス・ス・スR・ス・ス・ス[・スg | 100 ・ス・ス・ス・ス・ス・ス,・スネゑソス・スフセ・スb・スg | 5000 ・スワつゑソス・ス・ス ・ス・ス・ス・ス・ス・ス | 10000 ・ス`・ス・ス・スR・ス・ス・ス[・スg | 100 ・ス・ス・ス・ス・ス・ス,・スネゑソス・スフセ・スb・スg | 5000 ・スワつゑソス・ス・ス ・ス・ス・ス・ス・ス・ス | 10000 ・ス`・ス・ス・スR・ス・ス・ス[・スg | 100 ・ス・ス・ス・ス・ス・ス,・スネゑソス・スフセ・スb・スg | 5000 ・スワつゑソス・ス・ス ・ス・ス・ス・ス・ス・ス | 10000 (12 rows) test=> \encoding EUC-JP test=> select * from shinamono; hinmei | nedan ---------------------+------- ・ス゜、・ス・ス・ス | 100 ・ス・ス・ス・ス・ス・ス | 150 ・ス・ス・ス・ス・ス・ス | 2500 ・ス・ス・ス逾ウ・ス・シ・ス・ス | 100 ・ス・ス・ス・ス・ス・ス,・スハ、・ス・スΥ・ス・スa・ス | 5000 ・ズ、ト、・ス・ス・ス ・ス・ス・ス・ス・ス・ス | 10000 ・ス・ス・ス逾ウ・ス・シ・ス・ス | 100 ・ス・ス・ス・ス・ス・ス,・スハ、・ス・スΥ・ス・スa・ス | 5000 ・ズ、ト、・ス・ス・ス ・ス・ス・ス・ス・ス・ス | 10000 ・ス・ス・ス逾ウ・ス・シ・ス・ス | 100 ・ス・ス・ス・ス・ス・ス,・スハ、・ス・スΥ・ス・スa・ス | 5000 ・ズ、ト、・ス・ス・ス ・ス・ス・ス・ス・ス・ス | 10000 (12 rows) test=> \encoding UTF-8 test=> select * from shinamono; hinmei | nedan ---------------------+------- みかん | 100 りんご | 150 メロン | 2500 チョコレート | 100 メロン,なしのセット | 5000 まつたけ すだち | 10000 チョコレート | 100 メロン,なしのセット | 5000 まつたけ すだち | 10000 チョコレート | 100 メロン,なしのセット | 5000 まつたけ すだち | 10000 (12 rows)

  • uff-n
  • お礼率54% (47/87)

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

\encoding は、データベースサーバとクライアントとの間で 文字コードを変換することを指示します。 \encoding SHIFT-JIS とすれば、クライアントが扱う文字コードは SHIFT-JIS として、データベースに登録する際は SHIFT-JIS から データベースの文字コードに変換され、データベースからデータを 取り出した場合は、データベースの文字コードから SHIFT-JIS に 変換されて取り出されます。 しかし、これとは別に端末ソフトウェアが扱う文字コードがあります。 ご利用になられている端末ソフトウェアは何でしょうか。 TeraTerm, Putty それとも Linux 上で Gnome 端末でしょうか。 これらの端末ソフトウェアにも文字コードの設定があり、UTF-8 と 設定した端末では SHIFT-JIS に変換されて取り出されたデータは 正しく表示されません。 質問されている例では、端末ソフトウェアの文字コードが UTF-8 と 設定されているのに、データベースからデータを SHIFT-JIS や EUC-JP で取り出しているために化けているのだと思います。

uff-n
質問者

お礼

す、すばらしいい!! 非常に良くわかりました。 感謝です!! ありがとうございました!!!

その他の回答 (1)

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

端末の文字コードが UTF-8 になっているため、 SHIFT-JIS や EUC-JP で表示したときに文字化けしている だけではありませんか。

uff-n
質問者

補足

早速のお返事いただきありがとうございます。 おっしゃるとおり、CentOSの文字コードは、UTF-8ですので、 それ要因だとわかりましたが、理解の仕方でくるしんでいます。 CentOSの文字コードをLANG="ja_JP.eucJP"にしました。 その後、\encoding SJISを実行して、Windowsのcsvファイルは取り込めました。 ちなみにこのとき、DBに格納されている文字コードは、EUC-JPですよね?たぶん。; 続けて、今とりこんだテーブルをselect * from shinamono;のように参照すると、 文字化けしますので、再度、\encoding EUC-JPとして、LANGと同じにしましたが、 まだ、文字化けします。 ここらへん、細かいですが、どのようになっていますでしょうか。

関連するQ&A

  • 空白文字を含む文字列データの検索

    検索したいデータに空白がある時空白のない検索文字列でlike検索して データがヒットするようにしたいです col1 NTTデ ー タ NTTデ - タ シ ス テ ム ズ NTTデ ー タ ク オ リ テ ィ 日立製作所 IBM このようなカラムのデータが入っているとします ※空白を含むデータや空白を含まないデータがあるとします これを select * from table1 where col1 like '%NTTデータシス%' とするとNTTデ ー タ シ ス テ ム ズが検索されるようにしたいと思っています。 replace関数を使って実現しようと思ったのですが SELECT REPLACE(col1,' ','') as col1 From table1 where col1 like '%システムズ%' これだとデータがヒットせず単純に表示するときに空白が削除されるだけです どうすれば空白を含むデータを検索することができるでしょうか できれば全角・半角両方を含む文字のデータでも検索できるようにしたいです SQLServer 2005を利用しています。

  • php5,MySQL5で文字化けが起こる

    環境:php5,MySQL5,XP MySQL5は、インストール時にsjisを指定。 php.iniもmbstring.internal_encoding = SJIS ドスプロンプトでSelect文を発行すると漢字で表示されます。 $dbtype = "mysql"; $sv = "localhost"; $dbname = "*****"; $user = "root"; $pass = "*****"; // 文字コード $enc_disp = "EUC-JP"; $enc_db = "EUC-JP"; // データの文字コードを変換する関数 function cnv_enc($string, $to, $from) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, $from . ", " . $to); if ($det_enc and $det_enc != $to) { return mb_convert_encoding($string, $to, $det_enc); } else { return $string; } } // データベースに接続する $dsn = "$dbtype://$user:$pass@$sv/$dbname"; $conn = DB::connect($dsn); $sql = "SELECT * FROM A"; $res = $conn->query($sql); →この後、SQLの内容をIEで表示させると ”2 Web?? 002 ??????????????”の様に テーブルの中の漢字の部分だけが??????で表示されます。 ヒント、参考になるサイトなど、教えていただけると幸いです。

    • ベストアンサー
    • PHP
  • SQL文で「あ」などの2バイトの文字を条件に入れるとエラーになる。

    PHPとPostgreSQLでファイルを作成しました。 (2)、(3)の場合だと問題なく動作しますが、 (1)の場合だと動作しません。 「あ」が2バイトなのが原因かとおもうのですが、 よくわかりません。他に原因あるのでしょうか。 ********************************************** 環境 PHP5 Apache2.2 PostgreSQL8.24 ********************************************* <?php // 接続設定(サーバ/データベース/ユーザ/パスワード) $sv = "localhost"; $dbname = "test"; $user = "user"; $pass = "pass"; // 文字コード $enc_disp = "EUC-JP"; $enc_db = "EUC-JP"; // データの文字コードを変換する関数 function cnv_enc($string, $to, $from) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, $from . ", " . $to); if ($det_enc and $det_enc != $to) { return mb_convert_encoding($string, $to, $det_enc); } else { return $string; } } // データベースに接続する $conn = pg_connect("host=$sv dbname=$dbname user=$user password=$pass") or die("接続エラー"); (1)$sql = "select * from test WHERE name LIKE N'あ%'"; (2)$sql = "select * from test WHERE tel LIKE N'090%'"; (3)$sql = "select * from test WHERE no LIKE N'a%'"; ?> ********************************************* nameには、名前の文字列(いとう、さとう)が、 telには、電話番号(090…、03…)が、 noには、アルファベット一文字(a、b)が 入力されています。 *********************************************

  • MySQL5のデータを、SQL文を使いcsv形式でダウンロードさせると文字化けします

    環境:Apache2&PHP5&MySQL5 MySQL5のデータを、SQL文を使いcsv形式でダウンロードさせると文字化けします。 -- <?php header("Content-Type: application/octet-stream"); ?> <?php header("Content-Disposition: attachment; filename=output.csv"); ?> <?php $srv = "localhost"; // サーバー名 $id = "root"; // ユーザーID $passwd = "******"; // パスワード $dbn = "sample"; // データベース名 $sql = "SELECT * FROM result"; // SQL文 $db=mysql_connect($srv,$id,$passwd); mysql_select_db($dbn,$db); $rs=mysql_query($sql,$db); for($i=0; $i<mysql_num_fields($rs); $i++){ print(mb_convert_encoding(mysql_field_name($rs,$i),"SJIS","EUC-JP").","); } print("\n"); for($j=0 ;$j<mysql_num_rows($rs); $j++) { for($k=0; $k<mysql_num_fields($rs); $k++) { $str=mysql_result($rs,$j,$k); print(mb_convert_encoding($str,"SJIS","EUC-JP").","); } print("\n"); } mysql_close($db); ---ダウンロードしたCSVは半角英数文字はそのまま出ますが、 日本語(全角)が、?に化けます。(下記の参照してください) 24 2 1 444 4444 2008/7/3 15 ? 1E+18 ??? ????? ?????? 25 2 1 444 kojiide 2008/7/3 30 ? 1E+18 ??? ????? ?????? 26 2 1 444 kojiide 2008/7/3 30 ? 1E+18 ??? ????? ?????? --- print(mb_convert_encoding($str,"SJIS","EUC-JP").","); でSJISになっていると思うのですが、どなたかアドバイスいただけると幸いです。

    • ベストアンサー
    • PHP
  • PHP・SQLite3文字化け

    いつもお世話になります。 PHP Version 5.3.5 とSQLite3を使用して 簡単なプログラムを勉強中なのですが・・・ <?php echo ("テストテーブル参照<br />"); try { $dbh = new PDO('sqlite:testdb'); $res = $dbh->query( 'SELECT * FROM test'); while( $row = $res->fetch( PDO::FETCH_ASSOC ) ) { var_dump( $row ); } } catch( PDOException $e ) { echo 'Connection failed: ' . $e->getMessage(); } ?> 上記のプログラムを実行すると次のように表示されます。 テストテーブル参照 array(3) { ["id"]=> string(3) "001" ["name"]=> string(12) "螻ア荳九€€豬ゥ" ["adress"]=> string(12) "逾槫・亥キ晉恁" } array(3) { ["id"]=> string(3) "002" ["name"]=> string(15) "逋ス逾槭€€蜥御ケ・ ["adress"]=> string(9) "蝓シ邇臥恁" } テーブルtestには3フールドあり 全て文字列型なのですが、数字は正しく表示されますが、漢字が表示されません。 どなたかご教示頂けますでしょうか。 何卒よろしくお願い致します。

    • ベストアンサー
    • PHP
  • SQL文の日本語の箇所で文字化け

    環境はxp、apache2、php5、Postgresql8.2です。 1台のPCをサーバ&クライアントにしています。 ただ今PHPとPostgresqlの勉強をしています。 いつも質問に答えてくれてありがとうございます。 bool型のデータを yの場合は「○」 nの場合は「×」 で表示するために以下のようにしました。 --------------------------- $sql_limit2 = "SELECT m_lecturehistory.lecturecode, CASE WHEN m_lecturehistory.syukketu='y' then '○' else '×' end as syu FROM m_lecturehistory;"; $sql_limit = mb_convert_encoding($sql_limit2,"EUC-JP","eucJP-win"); $rs_limit = pg_query($d_base,$sql_limit) or die("quary faild sql_limit"); --------------------------- ところが「○」「×」が表示されず 「??」になってしまいます。 文字コードは、 ポスグレとソースは「EUC-JP」 表示は「UTF-8」です。 ご教示して頂けたら幸いです。

  • mb_send_mailの2重投稿を防止したい

    初めて質問させていただきます。 動作環境はPHP4.3.0になります。 <? $to = "test@test.com"; $subject = "テスト"; $addheader = "From: $_POST[mail]\n"; $msg = "*************"; $to = mb_convert_encoding($to, "SJIS", "EUC-JP"); $subject = mb_convert_encoding($subject, "SJIS", "EUC-JP"); $msg = mb_convert_encoding($msg, "SJIS", "EUC-JP"); $addheader = mb_convert_encoding($addheader, "SJIS", "EUC-JP"); mb_language("Ja"); mb_internal_encoding("SJIS"); mb_send_mail($to, $subject, $msg, $addheader); setcookie("formdata", $posted , time()-1200); }; ?> 上記の用に記述をして、メールが届くのは確認をしたのですがなぜか9割位の確立でメールが二通届きます。 mb_send_mailの前後にecho分で文字を表示させたのですが、ループしている気配もありません。 どなたかこの現象を回避できる方法をお知りでしたらご教授下さい。 何卒、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHP+MYSQLで検索の不具合

    MYSQLをEUC、PHPソースをEUCに 統一し、 mbstring.internal_encoding = EUC-JP mbstring.http_input = auto と設定し、 SQLに select * from aaa where b like '%$keyword%'; のようにキーワードを渡すと、文字によっては 検索にかかってくれないものがあります。 例えば、 俺 世界 男 はOKで 選手 男の子 は NG といった不可解な現象なんです。 他にも同じ文字を利用しているのに、検索に かかるレコードとそうでないものがあったりします。 何か考えられる原因はあるでしょうか

    • ベストアンサー
    • PHP
  • 文字化けしてしまって困っています

    postgresのデータベースから日本語の入った列の取得が上手くできずに困っています。 どうすればよいのでしょうか。。。 【DB】 postgres:9.1.1 perl: v5.10.1 databaseの文字コード:UTF-8 【クライアント】 postgres:8.4.0 perl:v5.8.8 文字コード:ECU-JP このような環境で、クライアントで 県名テーブルから県名を取得する以下のようなperlを実行した結果、 OUT.csvの県名列が文字化けしてしまったため (1)のように修正したのですがエラーとなってしまいます。 convertの記述の仕方が悪いのでしょうか? DBD::Pg::st execute failed: ERROR: function convert(character varying, unknown, unknown) does not exist at character 19 (Test.pl) #!/usr/local/bin/perl use DBI; $query = <<EOF; SELECT KEN_ID, KEN_NAME  ←修正前 convert(KEN_NAME,'UTF-8','EUC-JP')←(1) FROM KEN_MASTER EOF $dbi = DBI->connect("dbi:Pg:dbname=datbase;host=DATA_SV","hogeUser","hogePass"); $dsi = $dbi->prepare($query); $dsi->execute(); open(OUT, "> /OUT.csv"); while ($shr = $dsi->fetchrow_arrayref) { print OUT join(",", @$shr), "\n"; } close(OUT); $dsi->finish(); $dbi->disconnect(); exit();

  • 取得値の複数使用

    $result = mysql_query("SELECT id, name FROM mytable"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { $id = mb_convert_encoding($row['id'] , "SJIS", "EUC"); $name = mb_convert_encoding($row['name'], "SJIS", "EUC"); echo $id.":".$name; } 一度DBより取得した値 $resultの中身を複数回使用したいのですが・・・。 毎回、DBにアクセスしないとダメですか?

    • 締切済み
    • PHP