質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

2回答

4992閲覧

mysqlのテーブルをcsvで移行時に、ほとんどのレコードがインポートされない

vowd1

総合スコア53

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

1クリップ

投稿2016/08/21 15:15

編集2022/01/12 10:55

mysqldumpして取得したテーブルのcsvを別のmysqlにLOAD DATA INFILEでインポートしたのですが、90万行ぐらいあるレコードのうち、122行しか読まれませんでした。(csvにはきちんと読み込まれているのを確認してあります。)

叩いたコマンドは以下のとおりです。

LOAD DATA LOCAL INFILE '/vagrant/data1.csv' into table SampleTable FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\';

この原因はどのようなことが考えられるでしょうか。なお、このcsvは別のLinux機からとったもので、windowsマシン上で作られたものではないので、

LINES

TERMINATED BY '\r\n'

の話とは関係ないと思われます。(実際このキーワードを付けると、インポートは1件のみしかできませんでした)

あと、selectを叩くと、日本語の部分が文字化けしていたため、

show variables like "chara%";

を実行すると、案の定latin1の項目があったため、my.cnfを書き換えて、現在はlatin1の項目がないことを確認してあります。日本語が???となってしまうのですが、これはどのように対処すべきでしょうか。

追記1:なお、mysqld.logが吐かれるようにmy.cnfを書き換えたのですが、特にLOAD FILEに関するエラー等は出ておりませんでした。

追記2:用いたcsvの文字コードはutf8でした。

[vagrant@localhost vagrant]$ nkf -g data1.csv

UTF-8 (LF)

追記3:mysqlのバージョンは5.6.20です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A-pZ

2016/08/21 15:41

CSVエクスポートの出力形式もあると、回答が得られるかもしれません(自信なし)
CodeLab

2016/08/21 16:26

入力元、出力先のデータベースの文字コードや、出力されたCSVの文字コードはすべて意図したものになっていますか? データを丸ごと移行ということであれば、CSVではなくsqlで出したほうが悩まなくて済みますがSQLにしない理由はなぜでしょう? コマンドが良くわからないということであれば、phpmyadmin上からやるとわかりやすいかもしれません。
km668

2016/08/21 21:34

文字コードも含めてエクスポートするSQLとインポートするSQLは以下のように 整合していないとトラブルにみまわれます。 整合させるには明示的に指定させるのが好ましいと思います。 Msqlの移行でmysqldumpを使って私もさんざん痛い目にあったことがあります。(テーブル定義やプロシジャーはmysqldumpでしか取り出せませんが、テーブルデータはSQLで行った方が確実です。) SELECT * FROM スキーマ名.テーブル名 INTO OUTFILE '/フォルダ名/ファイル名' CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'; TRUNCATE TABLE スキーマ名.テーブル名; LOAD DATA INFILE '/フォルダ名/ファイル名' INTO TABLE スキーマ名.テーブル名 CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"';
Panzer_vor

2016/08/21 23:28

CSVエクスポート時の文字コードと出力形式とインポート時の文字コード取込形式は一致してますか? また文字化けというのは、 取込結果が化けているという認識で問題ないでしょうか?
A.Ichi

2016/08/22 02:14

csvから取り込まれた122行が先頭からの連続であれば123行の文字コードやエスケープ、NULL等を疑ってみては?
guest

回答2

0

CSVもUTF-8。
LOAD時もUTF-8として登録。
DBもUTF-8に変えた(再起動済?)。

とすれば、次は、TABLEがUTF8かどうかの確認ですね。
TABLEをDROP CREATEしていないければ、latin1のままになっているはず。
show table status from [table名];
もしくは
show create table [table名];
で確認できます。

あとは、他の方が言うように、
登録されている122件のデータの状態を確認が必要です。
122件目も正常に登録されているか。(途中で切れていないか)
123件目に変なデータ(改行や型違い・桁オーバー)があるか。

そもそも、登録するテーブルに元々データが入っていて、主キーが被っていないか。
etc...

上記でも解決できなかった場合、
テーブル定義と
切れている部分のCSVの中身と
登録されている中身を記載して頂ければ、
より明確な答えを得られるかもしれません。

投稿2016/08/26 01:23

tomari_perform

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

A.Ichiさんも仰っていますが、

  • 122行だけなら正常にインポートできるのか
  • 123行にするとエラーが出るのか

と現象発生の前後で分けて検証されるとよろしいかと思います。
122行目か123行目に処理できない記号やNULL、改行などが入っている可能性が考えられます。

文字化けについてはMySQLの設定以外にもテーブルやフィールドの文字コードも疑ってみて下さい。

投稿2016/08/25 02:23

bananacoffee

総合スコア260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問