web-dev-qa-db-ja.com

MySQLはCSVデータからNULL値をロードします

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

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

次のテーブルがMySQLで作成されました。

 + ------- + -------- + ------ + ----- + --------- + ---- --- + 
 |フィールド|タイプ|ヌル|キー|デフォルト|追加| 
 + ------- + -------- + ------ + ----- + --------- +- ----- + 
 |一つ| int(1)|はい| | NULL | | 
 | 2 | int(1)|はい| | NULL | | 
 | 3 | int(1)|はい| | NULL | | 
 | 4 | int(1)|はい| | NULL | | 
 | 5 | int(1)|はい| | NULL | | 
 + ------- + -------- + ------ + ----- + --------- + ---- --- + 

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

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

結果のテーブル:

 + ------ + ------ + ------- + ------ + ------ + 
 |一つ| 2 | 3 | 4 | 5 | 
 + ------ + ------ + ------- + ------ + ------ + 
 | 1 | 2 | 3 | 4 | 5 | 
 | 1 | 2 | 3 | 0 | 5 | 
 | 1 | 2 | 3 | NULL | NULL | 
 + ------ + ------ + ------- + ------ + ------ + 

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

残念ながら、この段階でNULLと0を区別できるようにする必要がありますので、どんな助けでも歓迎します。

ありがとう.

編集する

SHOW WARNINGSの出力:

 + --------- + ------ + --------------------------- ----------------------------- + 
 |レベル|コード|メッセージ| 
 + --------- + ------ + ------------------------- ------------------------------- + 
 |警告| 1366 |誤った整数値:行2の列 'four'の '' 
 |警告| 1261 |行3にはすべての列のデータが含まれていません| 
 |警告| 1261 |行3にはすべての列のデータが含まれていません| 
 + --------- + ------ + --------------------------- ----------------------------- + 
157
Spiros

これはあなたが望むことをします。 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,'')
;
175
Duncan Lock

MySQLマニュアル 言う:

LOAD DATA INFILEを使用してデータを読み取る場合、空の列または欠落している列は ''で更新されます。列にNULL値が必要な場合は、データファイルで\ Nを使用する必要があります。状況によっては、リテラルの単語「NULL」も使用できます。

したがって、次のように空白を\ Nに置き換える必要があります。

1,2,3,4,5
1,2,3,\N,5
1,2,3
122
Janci

動作は、データベース構成によって異なります。厳格モードでは、これはエラーをスローするか、警告をスローします。データベース構成を識別するために、次のクエリを使用できます。

mysql> show variables like 'sql_mode';
6
Dobi

入力CSVを前処理して、空のエントリを\ Nに置き換えます。

正規表現の試行:s/, /、\ n、/ gおよびs /、$ /、\ N/g

幸運を。

2
Sam Goldman