I'm using MySQL 5.7.35. If I use the LOAD DATA INFILE command on a CSV file with NULL as an unquoted string value in the CSV file, the value is imported as NULL in MySQL.
For example, if I import a CSV file with the following content:
record_number,a,b,c,d,e,f
1,1,2,3,4,5,6
2,NULL,null,Null,nUlL,,"NULL"
The imported table will have the following values:
--------------- ------ -------- -------- -------- -------- --------
| record_number | a | b | c | d | e | f |
--------------- ------ -------- -------- -------- -------- --------
| 1 | 1 | 2 | 3 | 4 | 5 | 6 |
| 2 | NULL | "null" | "Null" | "nUlL" | "" | "NULL" |
--------------- ------ -------- -------- -------- -------- --------
Is there any way to force column a, record 2, to be imported as a string without modifying the CSV file?
Update
@Barmar Pointed out that there's a paragraph in the MySQL documentation on this behavior here:
If FIELDS ENCLOSED BY is not empty, a field containing the literal word NULL as its value is read as a NULL value. This differs from the word NULL enclosed within FIELDS ENCLOSED BY characters, which is read as the string 'NULL'.
CodePudding user response:
This is documented here:
If
FIELDS ENCLOSED BYis not empty, a field containing the literal wordNULLas its value is read as aNULLvalue. This differs from the wordNULLenclosed withinFIELDS ENCLOSED BYcharacters, which is read as the string'NULL'.
So you need to specify the quoting character with something like FIELDS ENCLOSED BY '"' and then write "NULL" in the CSV file.
You could check for a NULL value in your code and convert it to a string.
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(record_number, @a, @b, @c, @d, @e, @f)
SET a = IFNULL(@a, 'NULL'),
b = IFNULL(@b, 'NULL'),
c = IFNULL(@c, 'NULL'),
d = IFNULL(@d, 'NULL'),
e = IFNULL(@e, 'NULL'),
f = IFNULL(@f, 'NULL')
However, this can't distinguish between an intentional NULL written as \N and MySQL treating NULL as NULL.
