mysql 从 csv 文件加载并使用 str_to_date 时不读取 \N

mysql not reading \N when loading from csv file and using str_to_date

提问人:liang 提问时间:3/13/2023 最后编辑:P.Salmonliang 更新时间:3/13/2023 访问量:38

问:

以下是我的表格和文件

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文件。

我可以使用哪些其他选项或函数来解决此问题?

mysql 日期 null

评论

0赞 Amadan 3/13/2023
在MySQL中等价于;若要在字符串文本中获取反斜杠,请对其进行转义:.在加载的文件中也是如此:“将转义字符前面的字符解释为转义序列。例如,、 和 分别表示制表符、换行符和反斜杠。有关转义序列的完整列表,请参阅后面的讨论。'\N'N'\\N'LOAD DATA\ \t\n\\ FIELDS ESCAPED BY
0赞 Amadan 3/13/2023
尝试(空字符串)关闭转义机制。LOAD DATA ... FIELDS ESCAPED BY ''
0赞 liang 3/13/2023
它仍然不起作用。它只是在第 1 行的相同错误 1292 中添加反斜杠“\N”。我尝试添加额外的斜杠或使用转义者。
0赞 Amadan 3/13/2023
有两个问题:你的代码被误解了(试着看看会发生什么);你的文件被误解了。您需要同时修复两者;第一种是通过编写代码,第二种是通过防止转义。如果收到“日期值不正确:第 1 行”date“列的”\N“(带反斜杠),则表示文件已被正确读取,但(或)无法检测到 。'\N'SELECT '\N'SELECT '\\N'\N'\\N'LOAD DATAIFNULLIF\N
0赞 liang 3/13/2023
@Amadan在两次修复后仍然显示“日期值不正确:第 1 行”日期“列的”\N“,我该怎么办?我使用 nullif(attribute, '\N') 的其他表工作得很好

答:

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 的情况下,\ 在测试之前被剥离,因此只需进行简单的测试即可。