debugsqlMinor
MySQL Error when importing CSV with empty fields
Viewed 0 times
errorwithfieldscsvemptymysqlwhenimporting
Problem
I have CSV file with exported table, that has rows with fields that do not contain values. Columns are separated using "," and if fields have no values they look like that: ,,,,,, I tried to load data using following code:
Columns in target table (to be loaded with data from this CSV file) are nullable, but server returns error:
When I put NULL between commas in CSV file, server do not return any error. Is it possible to change some setting to have table loaded without changing the CSV file?
LOAD DATA INFILE "C:/table.csv"
INTO TABLE target_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWSColumns in target table (to be loaded with data from this CSV file) are nullable, but server returns error:
"Incorrect integer value"When I put NULL between commas in CSV file, server do not return any error. Is it possible to change some setting to have table loaded without changing the CSV file?
Solution
Something like this, checking every value for '', and inserting NULL instead, may help. Change a,b,c,d for the actual name and number of rows on the table:
Check the syntax for
$ cat /tmp/test.csv
test1, test2, test3, test4
,,,
1,2,3,4
,,,
mysql> LOAD DATA INFILE "/tmp/test.csv" INTO TABLE test.test
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(@a, @b, @c, @d)
SET a = IF(@a = '', NULL, @a),
b = IF(@b = '', NULL, @b),
c = IF(@c = '', NULL, @c),
d = IF(@d = '', NULL, @d);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT * FROM test.test;
+------+------+------+------+
| a | b | c | d |
+------+------+------+------+
| NULL | NULL | NULL | NULL |
| 1 | 2 | 3 | 4 |
| NULL | NULL | NULL | NULL |
+------+------+------+------+
3 rows in set (0.00 sec)Check the syntax for
LOAD DATA for more details.Code Snippets
$ cat /tmp/test.csv
test1, test2, test3, test4
,,,
1,2,3,4
,,,
mysql> LOAD DATA INFILE "/tmp/test.csv" INTO TABLE test.test
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(@a, @b, @c, @d)
SET a = IF(@a = '', NULL, @a),
b = IF(@b = '', NULL, @b),
c = IF(@c = '', NULL, @c),
d = IF(@d = '', NULL, @d);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
mysql> SELECT * FROM test.test;
+------+------+------+------+
| a | b | c | d |
+------+------+------+------+
| NULL | NULL | NULL | NULL |
| 1 | 2 | 3 | 4 |
| NULL | NULL | NULL | NULL |
+------+------+------+------+
3 rows in set (0.00 sec)Context
StackExchange Database Administrators Q#97891, answer score: 6
Revisions (0)
No revisions yet.