7

多数のフィールドを含む MYSQL データベースがあり、その多くは数値として構成されています。

thicknessdouble(7,2) デフォルト NULL、

また

has_inputtinyint(4) デフォルト NULL、

このテーブルにcsvファイルをインポートする必要があり、使用しています

データ ローカル ファイル 'myfilepath/file.csv' をcombined、'\r\n' で終了する行を '"' で囲み、',' で終了するテーブル フィールドにロードします。

ただし、すべての数値フィールドの null 値はゼロに置き換えられています。一部のフィールドには正当な値のゼロがあり、これらを値のないフィールドと区別できるようにする必要があるため、これは非常に面倒です。

上記でわかるように、フィールドのデフォルトは null に設定されています。他のアドバイスとして、csv のすべての空白フィールドに \N を入力して null を示しています。

それにもかかわらず、ヌルはまだゼロに置き換えられています。手伝ってくれますか?

4

2 に答える 2

12

CSV のインポート中に NULL 列を処理するための規則はかなり複雑であるため、LOAD DATA INFILE のドキュメントに NULL 値の処理に関する専用セクションがあります:
http://dev.mysql.com/doc/refman/5.1/en/load -data.html

あなたの特定のケースでは:

FIELDS ENCLOSED BY が空でない場合、値としてリテラル単語 NULL を含むフィールドは NULL 値として読み取られます。これは、文字列 'NULL' として読み取られる FIELDS ENCLOSED BY 文字で囲まれた NULL という単語とは異なります。


欠落している値をNULLという単語(引用符なし)に置き換えて、CSV ファイルの前処理を試みます。

元の CSV ファイルにそのようなものがある場合:

0,1,2,,5

MySQL が 4 列目に NULL を正しく挿入するには、次のように変換する必要があります。

0,1,2,NULL,5
于 2013-08-02T10:53:02.857 に答える
7

それは同じ文で扱うことができます。

次の表を考えます。

CREATE TABLE `testcsv` (
  `col0` INT(11) NOT NULL,
  `col1` VARCHAR(20) DEFAULT NULL,
  `col2` DECIMAL(5,2) DEFAULT NULL
);

および次のファイル .csv: test.csv

1,\N,0
2,"string",102.20
3,\N,
4,"string",\N
5,"string",NULL
6,"string",

走る:

LOAD DATA INFILE 'path/test.csv' INTO TABLE `testcsv`
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
(`col0`, `col1`, @col2)
SET `col2` = IF(CHAR_LENGTH(TRIM(@col2)) = 0, NULL, @col2);

結果:

mysql> SELECT `col0`, `col1`, `col2` FROM `testcsv`;

+------+--------+--------+
| col0 |  col1  |  col2  |
+------+--------+--------+
|    1 | NULL   |   0.00 |
|    2 | string | 102.20 |
|    3 | NULL   |   NULL |
|    4 | string |   NULL |
|    5 | string |   NULL |
|    6 | string |   NULL |
+------+--------+--------+
6 ROWS IN SET (0.00 sec)
于 2013-08-02T12:24:17.630 に答える