从本地 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 '"'
选项一起使用,可能会很复杂。您可能希望用文本中未出现的一些不同字符将字段括起来。
在导入制表符分隔值 (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 '"'
选项一起使用,可能会很复杂。您可能希望用文本中未出现的一些不同字符将字段括起来。