【问题标题】:Postgresql COPY encoding, how to?Postgresql COPY 编码,怎么做?
【发布时间】:2015-09-04 04:19:18
【问题描述】:

我正在导入一个包含 imdb 信息(如电影名称、电影 ID、演员、导演、评分等)的 .txt 文件,我使用 COPY 语句将其导入。我正在使用 Ubuntu 64 位。问题是,有些演员有不同的名字,比如 Jonas Åkerlund。这就是postgresql抛出错误的原因:

错误:“演员”列缺少数据 上下文:复制电影,第 3060 行:“tt0283003 Spun 2002 6.8 30801 101 mins. Jonas Ô ********** 错误**********

错误:“演员”列缺少数据 SQL 状态:22P04 上下文:复制电影,第 3060 行:“tt0283003 Spun 2002 6.8 30801 101 mins. Jonas Ô

我的复制语句如下所示:

COPY movie FROM '/home/max/Schreibtisch/imdb_top100t.txt' (DELIMITER E'\t', FORMAT CSV, NULL '');

我不完全知道,如何使用排序规则。请问你能帮帮我吗?一如既往,谢谢。

【问题讨论】:

    标签: postgresql collation


    【解决方案1】:

    排序规则仅确定字符串的排序方式。加载和保存它们时最重要的是编码。

    默认情况下,Postgres 使用你的client_encoding 设置来处理COPY 命令;如果它与文件的编码不匹配,你会遇到这样的问题。

    您可以从消息中看到,在尝试读取“Å”时,Postgres 首先读取了一个“Ô,然后遇到了某种错误。 “Å”的 UTF8 字节序列是 C3 85。 C3 在LATIN1 代码页中恰好是“Ô,而 85 未定义*。因此,该文件很可能是 UTF8,但被读取时就好像它是 LATIN1。

    应该像在COPY命令中指定适当的编码一样简单:

    COPY movie FROM '/home/max/Schreibtisch/imdb_top100t.txt'
    (DELIMITER E'\t', FORMAT CSV, NULL '', ENCODING 'UTF8');
    

    *我相信 Postgres 实际上将 LATIN1 中的这些“空白”映射到相应的 Unicode 代码点。 85 变为 U+0085,又名“NEXT LINE”,这解释了为什么它被视为 CSV 行终止符。

    【讨论】:

    • 非常非常感谢。我感谢您的帮助。伙计,没有这个网站我该怎么办。
    • 不幸的是它不起作用:(,我使用“SHOW SERVER_ENCODING”,它说的是UTF8,但为什么不起作用?
    • @Blnpwr: server_encoding 没关系,client_encoding 用于解释 COPY 文件。 SHOW client_encoding 告诉你什么?
    猜你喜欢
    • 2017-06-05
    • 2012-01-09
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 2012-04-04
    相关资源
    最近更新 更多