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

标签 mysql null load-data-infile

在导入制表符分隔值 (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/

相关文章:

php - 无法使用 PHP echo 创建的表单接收 post 参数

mysql - SQL 仅选择列上具有最大值的行

mysql - 定期将数据加载到表中的最佳方法是什么

MySQL加载数据InFile;如果跳过行

MySql、LOAD DATA 或 BATCH INSERT 或任何其他更好的批量插入方式

mysql - MySql 上的 EntityFramework 更改连接字符串不会更改结果数据

mysql - 多对一hibernate在删除一个时删除多个?

MySQL 表单上传错误 - 复选框节点 ER_BADD_NULL_ERROR : Column ' ' cannot be NULL

iphone - 网址为:(空),但请求字符串不为空

c# - 为什么我会收到错误 "NullReferenceException was unhandled"?