gpt4 book ai didi

java - MySQL 中的字段由 LOAD DATA INFILE 终止

转载 作者:行者123 更新时间:2023-11-29 06:53:05 25 4
gpt4 key购买 nike

我有一个函数,可以为我提供有关在 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

我可以提供什么字段终结器来避免此问题?我知道没有办法完全防止这种情况,但我想知道什么是最好的方法来使它不太可能发生。

我考虑过使用选项卡,但这也可能是数据的一部分。

更新:

根据 [Ike Walker] 提供的答案,用双引号将字段括起来就可以了。当然,这意味着我必须进一步装饰我的数据,但我怀疑这是唯一有保证的方法。

此外,如果字段中有任何引号,SQL 语句足够智能,不会将其识别为封闭字符,除非它后面跟着终止字符(因此在我们的例子中 ",将是字段终止的提示)。不幸的是,我的数据中该模式是字段的一部分。例如,

{type:long, range: "LONG","INT", amount:100}

为了让 SQL 将其视为单个字段,我必须将每个双引号替换为两个双引号。

{type:long, range: ""LONG"",""INT"", amount:100}

有关 here 的更多信息:

If the field begins with the ENCLOSED BY character, instances of that character are recognized as terminating a field value only if followed by the field or line TERMINATED BY sequence. To avoid ambiguity, occurrences of the ENCLOSED BY character within a field value can be doubled and are interpreted as a single instance of the character. For example, if ENCLOSED BY '"' is specified, quotation marks are handled as shown here:

"The ""BIG"" boss"  -> The "BIG" boss
The "BIG" boss -> The "BIG" boss
The ""BIG"" boss -> The ""BIG"" boss

最佳答案

此处的典型解决方案是将值括在引号中,至少当值包含字段分隔符时是如此。

例如,您可以像这样格式化输入:

foo, "hi, I am a value with a comma", bar 

然后,当您加载数据时,您可以将其包含在 LOAD DATA INFILE 语句中:

FIELD TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'

关于java - MySQL 中的字段由 LOAD DATA INFILE 终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46734051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com