在导入制表符分隔值 (TSV) 文件时,我发现在两种情况下 mysql 会注入(inject)双引号,我想将其禁用。
情况 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 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 '"'
一起使用,情况可能会很复杂选项。您可能希望用文本中未出现的一些不同字符将字段括起来。
关于mysql - 从本地 infile 加载到 mysql 中的表时如何禁用双引号插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48142311/