提问人:liang 提问时间:3/13/2023 最后编辑:P.Salmonliang 更新时间:3/13/2023 访问量:38
mysql 从 csv 文件加载并使用 str_to_date 时不读取 \N
mysql not reading \N when loading from csv file and using str_to_date
问:
以下是我的表格和文件
CREATE table LOCATION
(
Place varchar(50) not null,
Date date,
CONSTRAINT location_pk PRIMARY KEY(Place)
);
位置.txt:
Place Date
School 2023-03-04
Market \N
LOAD DATA INFILE “/xxxx/location.txt” INTO TABLE LOCATION FIELDS TERMINATED BY ‘\t’ LINES TERMINATED BY ‘\n’ IGNORE 1 LINES
(Place, date)
SET
Date=IF(date='\N', NULL, STR_TO_DATE(date, '%Y-%m-%d'));
Error Code: 1292. Incorrect date value: 'N' for column 'date' at row 1
或
Date=STR_TO_DATE(date,'%Y-%m-%d');
Incorrect date value: 'N ' for column 'Date' at row 24
或
Date=NULLIF(date, '\N'),
Date=STR_TO_DATE(date,'%Y-%m-%d');
Error Code: 1292. Incorrect date value: 'N' for column 'date' at row 1
我尝试使用三种不同的方法,但除非我使用 nullif,否则我的工作台似乎不会将 \N 读取为 null。我也无法编辑txt文件。
我可以使用哪些其他选项或函数来解决此问题?
答:
0赞
P.Salmon
3/13/2023
#1
使用输入预处理 dev.mysql.com/doc/refman/8.0/en/load-data.html 并测试@date中的第一个字符
DROP TABLE IF EXISTS T;
CREATE table T
(
Place varchar(50) not null,
Date date ,
CONSTRAINT location_pk PRIMARY KEY(Place)
);
LOAD DATA INFILE 'inputfile' INTO TABLE T
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(Place, @date)
SET
Date=case when left(@date,1) <> '2' then null else @date end
;
SELECT * FROM T;
+--------+------------+
| Place | Date |
+--------+------------+
| Market | NULL |
| School | 2023-03-04 |
+--------+------------+
2 rows in set (0.001 sec)
请注意 @date 到 DATE 的隐式转换
左 1 对于您的需求来说可能太简单了,但您明白了......
评论
0赞
liang
3/13/2023
谢谢你,它有效!你介意解释一下这一行吗 “Date=case when left(@date,1) <> '2' ”
0赞
P.Salmon
3/13/2023
不确定您的最后一条评论具体是关于什么的,一般来说,所有 sql 命令都可以在输入重新处理中使用,所以也许您对 <> 子句感到好奇?在 \N 的情况下,\ 在测试之前被剥离,因此只需进行简单的测试即可。
评论
'\N'
N
'\\N'
LOAD DATA
\
\t
\n
\\
FIELDS ESCAPED BY
LOAD DATA ... FIELDS ESCAPED BY ''
'\N'
SELECT '\N'
SELECT '\\N'
\N
'\\N'
LOAD DATA
IF
NULLIF
\N