我有一个函数可以提供有关DynamoDb表上完成的更新/插入的数据。对于每个upsert,我需要解析数据并将其映射到相应的MySQL表模式。我将这些数据加载到一个文件中并执行MySQL提供的LOAD DATA INFILE语句。
我的陈述看起来像这样:
LOAD DATA FROM S3 FILE '%s' REPLACE INTO TABLE %s FIELD TERMINATED BY ',' LINES TERMINATED BY '\\n'"
文件中的每一行都可能如下所示。
orderNumber123,ABC先生,纽约第五街,100,12-12-17
但问题是数据中的某些字段包含逗号','。现在这会导致问题,因为这个逗号被SQL解释为字段的终止符。
故障陈述可能如下所示。
orderNumber456,XYZ先生,新泽西州第三大道,100,12-12-17
我可以提供哪种现场终结器来避免此问题?我知道没有办法完全阻止这种情况,但我问的是什么是最不可能的方法。
我考虑过使用tab,但这也可能是数据的一部分。
更新:
根据[Ike Walker]提供的答案,用双引号括起字段就可以了。当然这意味着我必须进一步装饰我的数据,但我怀疑这是唯一有保障的方式。
此外,如果字段中有任何引号,则SQL语句足够智能,不会将其识别为封闭字符,除非它后跟终止字符(因此在我们的情况下",
将是提示终止一个领域)。
不幸的是,我有数据,这个模式是字段的一部分。例如,
{type:long,range:“LONG”,“INT”,金额:100}
为了使SQL将其视为单个字段,我必须用双引号替换每个双引号。
{type:long,range:“”LONG“”,“”INT“”,金额:100}
有关此here的更多信息:
如果该字段以ENCLOSED BY字符开头,则为该实例 只有在遵循的情况下,才会将字符识别为终止字段值 由字段或行TERMINATED BY序列。为避免歧义, 字段值中出现的ENCLOSED BY字符可以是 加倍并被解释为角色的单个实例。对于 例如,如果指定了ENCLOSED BY'“',则处理引号 如下所示:
"The ""BIG"" boss" -> The "BIG" boss
The "BIG" boss -> The "BIG" boss
The ""BIG"" boss -> The ""BIG"" boss
答案 0 :(得分:2)
此处的典型解决方案是将值括在引号中,至少在值包含字段分隔符时。
例如,您可以像这样格式化输入:
foo, "hi, I am a value with a comma", bar
然后,当您加载数据时,可以在LOAD DATA INFILE
语句中包含此内容:
FIELD TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'