Postgresql COPY编码,怎么样?

时间:2015-06-18 13:34:05

标签: postgresql collation

我正在导入包含imdb信息的.txt文件(例如moviename,movieid,actors,director,rating votes等)我使用COPY语句导入它。我使用的是Ubuntu 64位。问题是,有些演员有不同的名字,比如JonasÅkerlund。这就是postgresql抛出错误的原因:

  

错误:列“actor”缺少数据    背景:复制电影,第3060行:“tt0283003 Spun 2002 6.8 30801 101分钟.JonasÔ   **********错误**********

     

错误:列“actor”缺少数据   SQL状态:22P04   背景:COPY电影,第3060行:“tt0283003 Spun 2002 6.8 30801 101分钟.JonasÔ

我的副本声明如下:

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

COPY

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