1. ホーム
  2. mysql

[解決済み] MySQLがCSVデータからNULL値を読み込む

2022-04-21 22:51:18

質問

カンマで区切られた3列から4列の数値を含むファイルを持っています。空のフィールドは、行の最後にある場合を除き、定義されています。

1,2,3,4,5
1,2,3,,5
1,2,3

MySQLで以下のようなテーブルが作成されました。

+-------+--------+------+-----+---------+-------+
| フィールド|タイプ|Null|キー|デフォルト|エクストラ|||。
+-------+--------+------+-----+---------+-------+
| 1|int(1)|YES|NULL|||||||。
| 2|int(1)|YES||NULL||||。
| 3|int(1)|YES|NULL||||||||。
| 4|int(1)|YES||NULL||||。
| ファイブ|int(1)|YES|NULL|||||||||。
+-------+--------+------+-----+---------+-------+

MySQLのLOADコマンドを使用してデータをロードしようとしています。

LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS 
TERMINATED BY "," LINES TERMINATED BY "\n";

出来上がったテーブル。

+------+------+-------+------+------+
| 一|二|三|四|五|の順。
+------+------+-------+------+------+
| 1 | 2 | 3 | 4 | 5 | 
 
| 1|2|3|ヌル|ヌル|ヌル 
+------+------+-------+------+------+

問題は、生データでフィールドが空で定義されていない場合、MySQL は何らかの理由でカラムのデフォルト値(NULL)を使用せず、ゼロを使用するという事実にあります。フィールドがまったくない場合は、NULL が正しく使用されます。

残念ながら、現段階ではNULLと0を区別できるようにしなければならないので、何か手助けがあればありがたいのですが。

ありがとうございます。 S.

編集

SHOW WARNINGSの出力です。

+---------+------+--------------------------------------------------------+
| レベル|コード|メッセージ
+---------+------+--------------------------------------------------------+
| 警告|1366|行2の列'4'の整数値が不正確です。
| 警告|1261|第3行はすべての列のデータを含んでいません|。
| 警告|1261|3行目はすべての列のデータを含んでいません。
+---------+------+--------------------------------------------------------+

解決方法は?

これはあなたが望むことを実行します。4番目のフィールドをローカル変数に読み込み、ローカル変数が空文字列を含むことになる場合、実際のフィールドの値をNULLに設定します。

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(one, two, three, @vfour, five)
SET four = NULLIF(@vfour,'')
;

もし、全部が空の可能性があるなら、全部を変数に読み込んで、こんな風に複数のSET文がある。

LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = NULLIF(@vone,''),
two = NULLIF(@vtwo,''),
three = NULLIF(@vthree,''),
four = NULLIF(@vfour,'')
;