MySQLのLOAD DATAで固定長行フォーマットのファイルをロードする際の問題

このQ&Aのポイント
  • MySQLのLOAD DATAを使用して固定長行フォーマットのファイルをロードする際に、データが正しく登録されない現象が発生しています。
  • フィールドのデータが区切られずに取得されてしまうため、該当のフィールドにはデータが登録されていません。
  • char(2)の場合は2バイトの倍の4バイト、char(4)の場合は倍の8バイトとしてデータが区切られるため、フィールド2のデータが取得できません。
回答を見る
  • ベストアンサー

MySQLのLOAD DATAに関して

MySQLのLOAD DATAで、固定長行フォーマットのファイルのロードを行っています。 その際、以下のような現象の原因がわからず困っています。 データをロードするテーブル、ロードファイル、実行コマンドは以下になります。 -------------------- テーブル -------------------- フィールド1 char(2) フィールド2 char(2) -------------------- ロードファイル(テキストファイル) -------------------- 1020 3040 -------------------- 実行コマンド -------------------- LOAD DATA INFILE 'ロードファイル' INTO TABLE テーブル FIELDS TERMINATED BY '' ENCLOSED BY '' LINES TERMINATED BY '\r\n'; 結果は以下のように、フィールド2にはデータが登録されていません。 ------------- フィールド1  | フィールド2 ------------- 10      |  30      |  望んでいる結果は以下のような結果です。 ------------- フィールド1 | フィールド2 ------------- 10     |20  30     |40  いろいろ試してみたのですが、 どうもchar(2)の場合は2バイトの倍の4バイト、 char(4)バイトの場合は倍の8バイトというふうにデータが区切られるため、 フィールド1のデータを取得する際に4バイト取得してしまっており、 フィールド2の分のデータが取得できません。 どこに不備があるのかわからないのですが、 何か原因の検討がつく方がいたら、ご回答よろしくお願いします。

  • MySQL
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
回答No.2

>char(2)のフィールドに半角数字2桁をロードしようとしています。 なぜ、そんなことをするのでしょう? 格納される可能性があるのは、半角数字だけですか? 計算に用いることは、ないのでしょうか? 全角もあるのですか? あるいは、半角全角の混在もあるのですか? >このような場合はどうしたらよろしいのでしょうか? 何をしたいかによります。 たとえば、半角しか格納しないなら、MySQL 5.0以降では、列毎に文字コードを設定できます。これで、asciiなどに設定してしまう方法が考えられます。 create table t1 (c1 char(2) charcter set ascii, ・・・) 全角も格納するなら、入力データをタブ区切りにしておくといった方法が考えられます。データをタブ区切りにした上で、load data文も変更してみてください。 terminated by ''    ↓ terminated by '\t'

shigejun
質問者

お礼

回答ありがとうございました。 >たとえば、半角しか格納しないなら、MySQL 5.0以降では、列毎に文字コードを設定できます。これで、asciiなどに設定してしまう方法が考えられます。 これは知りませんでした。 テーブルには半角のみの格納なので、この方法で解決しました。 度々ありがとうございました。

その他の回答 (1)

回答No.1

MySQLの質問をする場合は、バージョンを明記してください。 すぐに思いつくだけでも、 MySQL 4.0以前・・・一部のジョイン、union、一時表などは実装済 MySQL 4.1・・・ジョインの拡張、サブクエリ、unicodeなどの実装。一部の仕様変更 MySQL 5.0・・・ビュー、ストアドプロシジャ、トリガなどの実装 といった、機能追加や一部の仕様変更があります。 char(n)のnも、MySQL 4.1から意味が変わりました。 文字コードを「日本語」などにしていて、半角数字を入力しようとしているからでは?

shigejun
質問者

お礼

回答ありがとうございます。 MySQLのバージョンは5.0.22です。 >文字コードを「日本語」などにしていて、半角数字を入力しようとしているからでは? はい、まさにその通りです。 データベースの文字コードはsjisで、ロードファイルもsjisです。 char(2)のフィールドに半角数字2桁をロードしようとしています。 このような場合はどうしたらよろしいのでしょうか? 度々すみませんが、よろしくお願いします。

関連するQ&A

  • BitフィールドにLOAD DATAできない

    以下の定義のテーブル(Bitフィールドを持つ)にLOAD DATAでデータを 入れようとしているのですがエラーになり困っています。 マニュアルにあるようにSET句を使用してLOADをしようとしているのですが 「You have an error in your SQL syntax;~」と コマンドの4行目のところで出てしまいます。どこがおかしいのでしょうか。 【テーブルの定義】 mysql> desc data; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+------+-----+---------+-------+ | key1 | int(11) | NO | PRI | NULL | | | key2 | int(11) | NO | PRI | NULL | | | date | datetime | NO | PRI | NULL | | | flg1 | bit(1) | NO | | b'1' | | +-------+----------+------+-----+---------+-------+ 【CSVファイルの内容】 1,2,"2016-12-17 10:00:00",1 1,2,"2016-12-17 11:00:00",0 【コマンド】 LOAD DATA INFILE 'C:/csv/data.csv' INTO TABLE test.data (key1, key2, date, @var1) SET flg1 = CAST(@var1 AS SIGNED) FIELDS TERMINATED BY ',' ENCLOSED BY '"';

  • sql*loader 数値のロード

    SQL*LOADERにて NUMBER(3,0)のフィールドに、小数点以下を含む数値をもったデータをロードすると 四捨五入か何かされて整数でデータがロードされてしまいます。 テーブル、CTLファイル、csvレコード、登録結果は以下のとおりです。 テーブル: CREATE TABLE tbl1 ( CLM001 NUMBER(3,0) NOT NULL, CLM002 VARCHAR2(30) ) CTLファイル: LOAD DATA INFILE 'tbl1.csv' BADFILE 'tbl1.bad' TRUNCATE INTO TABLE tbl1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS ( CLM001, CLM002 ) csvレコード: 0.9,aaaaa 3.1,bbbbb 登録結果(SQL*LOADER実行結果): 1,aaaaa 3,bbbbb 小数点を含むデータをロード時にエラーとしたいのですが、何かいい方法ありますでしょうか? 環境はSQL*Loader: Release 9.2.0.1.0になります。

  • MySQL の load data infile

    お世話になります。 MySQL のload data infile ... コマンドを使ってCSVファイルをテーブルに転送することをよくやっていますが、このコマンドには現在あるデータはそのままにして、新たにデータを追加するオプションなどはあるのでしょうか? 今までは空のテーブルにデータを転送していただけですが、既にあるデータに上書きすることなく、追加する方法があれば教えていただきたいと思います。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • LOAD DATA LOCAL INFILE

    LOAD DATA LOCAL INFILE を使ってmysql にcsv からデータを挿入したいのですが #1148 - The used command is not allowed with this MySQL version とエラーが出てきます。※エラー情報はmyphpadminから得ています。 以下の文を実行しています。 ※他のサーバーで動いているので、ソースに間違いはないと思います。 ※サーバーの引っ越しで出てきた不具合ですが、以前何かをしたかは覚えていません。。。 LOAD DATA LOCAL INFILE '/パス/data.txt' REPLACE INTO TABLE data fields terminated by ',' ENCLOSED BY '"' LINES TERMINATED BY ' ' 権限を付与すれば良い、と言う記事を読んだのですが 具体的にはどのような事をしたらいいのでしょうか? FTPでファイルをアップロードして、php を実行しています。 MySQL 5.1.73 PHP 5.3.3 よろしくお願いいたします。

    • 締切済み
    • PHP
  • mysqlのloadコマンドに引数をセットするバッチの作成

    mysqlのloadコマンドに引数をセットするバッチの作成 データ移行でロードするファイルが数多くあり バッチ処理(param.bat)で実行できるようにしたいのですが、 SQLスクリプト(param.sql)にうまく引数を渡すことができません。 引数1にデータ:aaa.txt 引数2にテーブル:test_tbl どうかアドバイスいただけないでしょうか。 宜しくお願いいたします。 OS:Windows XP 【実行時】 c:temp>param.bat aaa.txt test_tbl 【作成したファイルの記述】 param.bat ------- mysql test1 -u user1 -puser1 < param.sql %1 %2 param.sql ------- LOAD DATA INFILE '&1' INTO TABLE &2 FIELDS TERMINATED BY ',' ESCAPED BY '\\' LINES TERMINATED BY '\r\n'; exit;

  • LOAD DATA INFILE の使用について

    サーバにある、CSVファイルをデータベース(mysql)に登録したいです。 $query = "LOAD DATA INFILE '[ファイル名]' INTO TABLE [テーブル名] FIELDS TERMINATED BY ','"; を $result = mysql_query($query); として実行すると、 Access denied for user 'user'@'%' (using password: YES) というエラーになります。 色々検索すると、ユーザーはrootユーザーでないといけない・・・というのを見かけたのですが・・・ 普通のユーザーではLOAD DATA INFILEを使用できませんか? 私は、レンタルサーバを使用していて、レンタルサーバ上からしかユーザーを追加できません。 この場合、LOAD DATA INFILE~ は使用できないのでしょうか? また、もし使用できない場合、代替手段はあるのでしょうか?

    • ベストアンサー
    • PHP
  • LOAD DATA INFILE がどうしても出来ません。。

    PHP 4.4.8 MYSQL 4.0.27 で、HTMLはEUC MYSQLもEUCで運用しています。 PHPの中に以下のように動作させようとしています。 $sql = "LOAD DATA INFILE 'data.txt' INTO TABLE test FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'"; エラーを表示させるために $rst = mysql_query($query) or die("<b>A fatal MySQL error occured</b>.\n<br />Query: " . $query . "<br />\nError: (" . mysql_errno() . ") " . mysql_error()); すると A fatal MySQL error occured. Query: Error: (1065) Query was empty このような表示が出てきます。 テーブルはフィールド2つで両方とも varchar(100) にしています。 タブ区切り、改行はCRLFです。 こうしておいた方が、ミスが特定しやすいと思って。 11 1111 22 2222 phpmyadmin からは、load 出来ます。*フィールドの区切りを【\t】に変更するだけで。 同じディレクトリに上記PHPを書いたファイルと読み込ませる【data.txt】を置いています。 **同じMYSQL 同じディレクトリで表示やselect は出来るのでパスワードなどのミスでは無いようです。 やりたい事は、毎月10万レコード程度を入力したいのですが、 phpmyadmin からの操作ではなく、PHPで処理をしたいのです。 多分、そんなに難しい事ではないので 過去ログを見ても、本屋さんで探しても詳しく解説していなくて 私の間違いが、特定出来ません。 どなたかご教授いただけるととてもありがたいです。m(__)m

    • ベストアンサー
    • MySQL
  • PHP+MySQL でのcsvファイルインポート

    PHP + MySQL で、他システムから出力されてきたcsvファイルをテーブルへインポートしたいと考えています。 LOAD DATA INFILE で取り込もうとしていますが、対象のcsvファイルの特徴のためにうまく行かず苦戦しています。 取り込みたいファイルは、以下のようになっています。  ・各フィールドが "(ダブルクォート) で囲まれている  ・各フィールドは ,(カンマ) で区切られている  ・金額の項目には、桁区切りのカンマが入っている  例) "0001","あああああ",…(中略)…,"105,000","100,000","5,000",…     コード 項目名            税込み  税抜き 消費税  というような形です。    困っているのは、金額に使われている、桁区切りのカンマの処理についてです。  目的としては、データベースへ取り込むときには 105,000 は 105000 として取り込めればいいのですが、他システムから、桁区切りがなされた状態でcsvが作成されてきています。 LOAD DATA INFILE test.csv INTO TABLE data_table FIELDS TERMINATED BY ',' ENCLOSED BY '\"' IGNORE 1 LINES;  各項目のダブルクォートはENCLOSED BY で、項目を分けるカンマはTERMINATED BYで処理できていると思うのですが、金額の区切りに使われているカンマと項目の区切りのカンマを区別させられずに苦戦しています。  事前にcsvを加工するのも考えてはいるのですが、なるべくcsvを加工せずにそのまま取込したいと思います。  何か、簡単に回避できる方法等があればご教示願います。  宜しくお願いします。

    • ベストアンサー
    • PHP
  • LOAD DATA INFILE でエラー起きてデータを一括してロードできません。

    はじめまして。 質問があります。 現在WindowsXP Home、MySQL5.0.27を使用しているのですが、 テキストファイルのデータを一括でDBにロードしようとすると、 エラーが起きてしまいます。 ------------------------ Demo01.txt -------------------------- 1,あああ 2,いいい 3,ううう ------------------------ Demo01.sql --------------------------- create table test ( no integer not null, name varchar(30), primary key(no) )type=InnoDB; ---------------------------------------------------------------- mysql> load data low_priority infile 'C:/Demo01.txt' -> replace -> into table test -> fields terminated by ',' -> lines terminated by '/r/n' -> escaped by '\\'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use : 'escaped by '\\'' 付近: 6 行目 ---------------------------------------------------------------- 上記のようなエラーが出てしまいますので、試しにescaped by '\\' を削除して実行すると、 ---------------------------------------------------------------- Query OK, 1 row affected (0.09 sec) レコード数: 1 削除: 0 Skipped: 0 Warnings: 0 ---------------------------------------------------------------- と表示され1行しかロードできません。どうしたら全行をロードするこ とができるのでしょうか?どうかご教授お願いします。

    • ベストアンサー
    • MySQL
  • CSVファイルをMYSQLにインポート

    先日からMYSQL+PHPの勉強をはじめました。 データベース構築の際、以前作成したCSVファイルをMYSQLのテーブルとして 利用したいと考えております。 そこで、MYSQLコマンドより、 LOAD DATA LOCAL INFILE 'ファイル名.csv' INTO TABLE テーブル名 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'; Query OK, 0 rows affected (0.04 sec) Records: 102 Deleted: 0 Skipped: 102 Warnings: 0 とCSVファイル自体が悪いのかSQL文に問題がるのかインポートがうまくいきません。。 ちなみにCSVは  0,2011/6/2 0:00,80.94,81.32,80.55,80.92 0,2011/5/25 0:00,81.94,82.17,81.8,81.95 0,2011/5/23 0:00,81.77,82.04,81.32,81.99 環境はphpdevで一括でインストールした phpadmin: バージョン2.3.2 MYSQL: MySQL4 apache: 1.3.27 初心者で基本的な質問かもしれないですがどうかご教授お願いします。

    • ベストアンサー
    • MySQL