从本地 infile 加载到 mysql 中的 table 时如何禁用双引号插入?

How to disable insertion of double quotes when loading from local infile into table in mysql?

在导入制表符分隔值 (TSV) 文件时,我发现在两种情况下 mysql 注入了我想禁用的双引号。

案例 1:当字段值为 empty/blank(零个字符)时 - 而不是 NULL,插入 "" .我更喜欢它只是一个 NULL.

情况2:当字符串中已经有双引号时(即2" Square),它会将出现的双引号替换为两个双引号,它还将整个字符串用双引号引起来。示例:2" Square 被插入为 "2"" Square"。我希望它只是 2" Square,就像在 report.tsv 文件中一样。

我当前使用的 SQL 是(报告列是列的列表,每个列的定义为 VARCHAR(25) DEFAULT NULL

LOAD DATA LOCAL INFILE 'report.tsv' 
INTO TABLE properties 
IGNORE 1 LINES (report-columns)

我尝试添加 FIELDS ESCAPED BY '' 但这并没有改变结果。

我更喜欢一个计划,它能够在加载文件的同一查询中首先禁止这种情况发生,但如果这不可能,备份计划将是执行 cleanup 查询所有报告列在导入后立即为 运行 以解决上述两种情况 1 和 2

关于这两个计划的想法?

更新

对此进行进一步调查后,我确定导致情况 2 的不是 mysql 数据加载,而是加载前的干净脚本。在带有 LOAD DATA LOCAL INFILE 语句的同一查询中使用 SET 和 NULLIF 的答案已经很好地解决了案例 1,而无需第二次查询清理。

如果要插入 NULL,可以在源文本文件中使用文字 \N,或使用单词 NULL,具体取决于您的一些选项。这记录在 LOAD DATA INFILE 的手册中:https://dev.mysql.com/doc/refman/5.7/en/load-data.html

查找短语 "Handling of NULL values varies according to the FIELDS and LINES options in use" 并阅读以下内容(我不会将手册复制到此 Stack Overflow 答案中)。

另一种选择是使用表达式修改导入时的值(如果它是空字符串):

LOAD DATA LOCAL INFILE 'report.tsv' 
INTO TABLE properties 
IGNORE 1 LINES (report-columns)
SET some_col = NULLIF(some_col, '');

对于第二种情况,当您的输入文本数据中有双引号时,我不确定该推荐什么。我试过了,对我来说效果很好。我能够导入字符串 2" square.

如果将 LOAD DATA INFILE 与 ENCLOSED BY '"' 选项一起使用,可能会很复杂。您可能希望用文本中未出现的一些不同字符将字段括起来。