在mysql中从本地infile加载到表中时,如何禁止插入双引号?

s1ag04yj  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(440)

在导入tab分隔值(tsv)文件时,我发现有两种情况mysql注入了双引号,我想禁用它们。
情况1:字段值为空/空白(零个字符)-而不是 NULL ,一个 "" 被插入。我更喜欢它只是一个 NULL .
情况2:当字符串中已有双引号时(即。 2" Square ),它将双引号替换为两个双引号,并将整个字符串用双引号括起来。例子: 2" Square 插入为 "2"" Square" . 我希望它是公正的 2" Square ,与report.tsv文件中的相同。
我当前使用的sql是(report columns是一个列列表,每个列都有定义) VARCHAR(25) DEFAULT NULL )

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

我试着添加 FIELDS ESCAPED BY '' 但这并没有改变结果。
我更喜欢这样一种计划,即在加载文件的同一查询中首先禁用这种情况,但如果不可能,则备份计划是在导入后立即对所有报表列执行清除查询,以解决上述情况1和2。
两个计划都有什么想法?
更新
在进一步调查之后,我确定不是mysql加载数据导致了案例2,而是加载之前的干净脚本。在load data local infle语句的同一查询中使用set和nullif的答案很好地解决了案例1,而不需要第二次查询清理。

xcitsw88

xcitsw881#

如果要插入null,可以使用文本 \N 在源文本文件中,或者 NULL ,取决于您的一些选项。这在负载数据填充手册中有记录:https://dev.mysql.com/doc/refman/5.7/en/load-data.html
寻找短语“空值的处理根据所使用的字段和行选项而变化”,并阅读下面的内容(我不打算将手册复制到这个堆栈溢出答案中)。
另一个选项是使用表达式修改导入时的值(如果是空字符串):

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

对于第二种情况,当输入文本数据中有双引号时,我不确定该推荐什么。我试过这个,效果很好。我可以导入字符串 2" square .
如果使用带有 ENCLOSED BY '"' 选项。您可能希望用文本中未出现的其他字符将字段括起来。

相关问题