【发布时间】:2018-03-25 20:01:08
【问题描述】:
我有一个函数可以为我提供有关在 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, Mr. ABC, 5th Street New York, 100, 12-12-17
但问题是数据中的某些字段包含逗号“,”。现在这会导致问题,因为这个逗号被 SQL 解释为字段的终止符。
故障语句可能如下所示。
orderNumber456, Mr. XYZ, 3rd Avenue, New Jersey, 100, 12-12-17
我可以提供什么 FIELD TERMINATOR 来避免这个问题?我知道没有办法完全防止这种情况,但我想问什么是最好的方法来使它不太可能发生。
我曾考虑过使用选项卡,但这也可能是数据的一部分。
更新:
根据 [Ike Walker] 提供的答案,用双引号将字段括起来就可以了。当然,这意味着我必须进一步修饰我的数据,但我怀疑这是唯一有保证的方法。
此外,如果字段中有任何引号,SQL 语句足够智能,不会将其识别为封闭字符,除非它后面跟着终止字符(因此在我们的例子中,", 将是终止的提示一个领域)。
不幸的是,我有这个模式是字段一部分的数据。例如,
{type:long, range: "LONG","INT", amount:100}
为了让 SQL 将其视为单个字段,我必须将每个双引号替换为两个双引号。
{type:long, range: ""LONG"",""INT"", amount: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
【问题讨论】: