在导入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,而不需要第二次查询清理。
1条答案
按热度按时间xcitsw881#
如果要插入null,可以使用文本
\N
在源文本文件中,或者NULL
,取决于您的一些选项。这在负载数据填充手册中有记录:https://dev.mysql.com/doc/refman/5.7/en/load-data.html寻找短语“空值的处理根据所使用的字段和行选项而变化”,并阅读下面的内容(我不打算将手册复制到这个堆栈溢出答案中)。
另一个选项是使用表达式修改导入时的值(如果是空字符串):
对于第二种情况,当输入文本数据中有双引号时,我不确定该推荐什么。我试过这个,效果很好。我可以导入字符串
2" square
.如果使用带有
ENCLOSED BY '"'
选项。您可能希望用文本中未出现的其他字符将字段括起来。