PHP my admin で テキストファイルをインポートしようとしたら、以下のエラーがでました。
-----------------------------------------------------------------------------------------------------
LOAD DATA LOCAL INFILE '/var/tmp/php---' INTO TABLE `filename` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' IGNORE 1 LINES
#2027 - Malformed packet
------------------------------------------------------------------------------------------------------
このエラーの意味をご存じのかた、いらっしゃいましたら 何卒よろしくお願い申し上げます。
( Malformed packet とは、どのようなことでしょうか。
Mal は「悪い」という意味の接頭辞だと高校の時に教わったのですが。。)
前回質問でSJISに拘っておられたので
CSVファイルはEXCELなどWindows上で作成したものだと思います。
CSV は Comma-Separated Values の略なので本来はカンマで区切るものですが
タブで区切るものもCSVと呼ばれていたりしますので、ここでミスが生じます。
(b-wind 氏からのご指摘も、この点です。)
>Malformed packet
パケットのフォーマットがおかしい
→送られてきたデータの形式がおかしい
SAKURAではエラーとして返してますが、
(試してはいませんが)Coreの方ではエラーを無視しているだけかもしれません。
ちなみに 内部で使われている LOAD DATA INFILE命令のデフォルト設定では
・タブで区切る
・改行コードはLF(WindowsはCRLF)
・' や " などで囲まない。
です。
MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.8 LOAD DATA INFILE 構文
私は phpMyAdmin で sjis 形式のファイルという組み合わせは扱ってないので
前回質問にも答えられず、今回も完全な解決策をお伝えすることは出来ませんが
問題点を明確にすれば回答が得られやすくなるのではないかと思って回答させていただきました。
# pahoo氏は前回(question:1240665487)もお答えのようですし
# それによって貴殿が行動しておられると思いますので
# id:pahoo氏 および id:hijk05氏からの回答に期待するしかないかもしれません。
# 前回質問もまだ受付中の模様ですから、各人への返答欄またはコメント欄に
# 今回質問のquestion:1240681560 を書き込んで補足説明願ってはどうでしょうか?
余談ですが PHP my admin ではなく phpMyAdmin です
最近の検索サイトではどちらでも調べられたりしますが、
正確なほうが、より情報を得られやすくなりますし、プログラムの世界では
大文字と小文字の違いも正確に示さないと動かない場合もあったりしますので
以後、ご留意を。
インポートするCSVの書式が間違っていると考えられます。
フィールド区切り文字がタブになっていませんか? カンマに直してください。
レコード区切り文字の改行が「CR+LF」( \r\n, Windowsで使われる改行コード)になっていませんか? Unixで標準の「LF」(\n)にしてください。⇒(参考)改行コード
なんかすごい的外れな回答がついてるな。
LOAD DATA INFILE 構文には、 FIELDS (カラム区切り文字)と LINES (行区切り文字)の2種類が設定出来る。
MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.8 LOAD DATA INFILE 構文
FIELDS 節を指定しない場合、デフォルトは次のように記述した場合と同じです。
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
LINES 節を指定しない場合、デフォルトは次のように記述した場合と同じです。
LINES TERMINATED BY '\n'
注意: Winodows では行終端記号として 2 文字を使用しているため、テキストファイルを Windows システムで生成した場合は、通常、上の記述を LINES TERMINATED BY '\r\n' に変更する必要があります。wordpad などの一部のプログラムでは、行終端記号として \r を使用できます。
読み取り対象行のすべてに存在するプリフィックスをスキップする
参照元にあるとおり、デフォルトはタブ区切り、LF のみで改行なのでそのフォーマットに沿っていない1行が無視されたというのが警告の内容。
ただ、それでなぜ #2027 が出るのかの関連性は分からないが…。
MySQL :: MySQL 5.1 リファレンスマニュアル :: B.3 Client Error Codes and Messages
一応クライアント側でのエラーコードのようなので今回の処理自体にはこのメッセージは関係ない物と思われる。
御指導ありがとうございます。
いただいた資料を熟読して勉強いたします。
前回質問でSJISに拘っておられたので
CSVファイルはEXCELなどWindows上で作成したものだと思います。
CSV は Comma-Separated Values の略なので本来はカンマで区切るものですが
タブで区切るものもCSVと呼ばれていたりしますので、ここでミスが生じます。
(b-wind 氏からのご指摘も、この点です。)
>Malformed packet
パケットのフォーマットがおかしい
→送られてきたデータの形式がおかしい
SAKURAではエラーとして返してますが、
(試してはいませんが)Coreの方ではエラーを無視しているだけかもしれません。
ちなみに 内部で使われている LOAD DATA INFILE命令のデフォルト設定では
・タブで区切る
・改行コードはLF(WindowsはCRLF)
・' や " などで囲まない。
です。
MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.4.8 LOAD DATA INFILE 構文
私は phpMyAdmin で sjis 形式のファイルという組み合わせは扱ってないので
前回質問にも答えられず、今回も完全な解決策をお伝えすることは出来ませんが
問題点を明確にすれば回答が得られやすくなるのではないかと思って回答させていただきました。
# pahoo氏は前回(question:1240665487)もお答えのようですし
# それによって貴殿が行動しておられると思いますので
# id:pahoo氏 および id:hijk05氏からの回答に期待するしかないかもしれません。
# 前回質問もまだ受付中の模様ですから、各人への返答欄またはコメント欄に
# 今回質問のquestion:1240681560 を書き込んで補足説明願ってはどうでしょうか?
余談ですが PHP my admin ではなく phpMyAdmin です
最近の検索サイトではどちらでも調べられたりしますが、
正確なほうが、より情報を得られやすくなりますし、プログラムの世界では
大文字と小文字の違いも正確に示さないと動かない場合もあったりしますので
以後、ご留意を。
御指導ありがとうございます。
試してみましたところ、うまくいきませんでした。
LOAD DATA LOCAL INFILE '/var/tmp/php----' INTO TABLE `filename` FIELDS TERMINATED BY ',' LINES TERMINATED BY '/n' IGNORE 1 LINES
1) さくらでは、フィールドはきちんと" "で囲まないといけませんでしょうか?
(現時点で囲んでおりませんが、ローカルではインポートできました。)
2)さくらでは、フィールドのエスケープ記号もcsv中に盛り込む必要がありますでしょうか?
3)コアサーバーでは、インポートは正常終了しますが、テーブルは空のままです。
どうぞよろしくお願いいたします。