0

我有一个表,其中包含 300,000 行不受我控制,我需要导入。

我使用以下命令从 mysql 导出数据:

mysqldump -u root --password=secret --fields-enclosed-by='\"' -T/tmp apflora_beob

然后我尝试使用例如导入每个表:

\copy beob_evab FROM '/Users/alex/tmp/beob_evab.txt' (FORMAT 'csv', DELIMITER E'\t', NULL '\N', ESCAPE E'\"', ENCODING 'UTF8');

这适用于大多数表,也适用于包含 450,000 行的表。但在一个我得到这个错误:

ERROR:  value too long for type character varying(10)
CONTEXT:  COPY beob_evab, line 190310, column COUV_MOUSSES: "2\%  \N  \N  \N  \N  \N  \N  \N  \N  \N  \N  30  \N  15  \N  \N  \N  \N  \N  \N  \N  \N  \N  \N  \N  \N  0.01  \N  \N
Bachs, Dau..."

当我检查COUV_MOUSSES第 190'310 行中的字段时,它包含以下值:2"%.

我必须改变什么才能让它工作?

为了"2""%"根据@klin(谢谢!)获得正确的输出,我必须添加--fields-escaped-by='"'到 mysqldump 命令。这样就变成了:

mysqldump -u root --password=secret --fields-enclosed-by='"' --fields-escaped-by='"' -T/tmp apflora_beob

问题是:现在 Null 值导出为"N.

好吧,没问题,我想了想,把复制命令改成:

\copy beob_evab FROM '/Users/alex/tmp/beob_evab.txt' (FORMAT 'csv', DELIMITER E'\t', NULL '"N', ESCAPE "'", ENCODING 'UTF8');

这会在 Postgres 中产生以下错误:

ERROR:  CSV quote character must not appear in the NULL specification

而且似乎在 MySQL 中不能更改 Null 值的表示。

4

1 回答 1

1

该值应写为

"2""%"

根据RFC 4180 - 逗号分隔值 (CSV) 文件的通用格式和 MIME 类型

[5]。每个字段可能包含也可能不包含在双引号中(但是某些程序,例如 Microsoft Excel,根本不使用双引号)。如果字段没有用双引号括起来,则双引号可能不会出现在字段内。(...)

[7]。如果使用双引号将字段括起来,则出现在字段内的双引号必须通过在其前面加上另一个双引号来进行转义。例如:

   "aaa","b""bb","ccc"
于 2016-02-07T20:51:09.750 回答