我正在导入包含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 '');
我不知道如何使用排序规则声明。请问你能帮帮我吗?一如既往,谢谢。
答案 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行终止符。