【问题标题】:PSQL COPY statement error says character is encoded WIN1252 despite file seeming to be encoded UTF-8PSQL COPY 语句错误表示字符编码为 WIN1252,尽管文件似乎编码为 UTF-8
【发布时间】:2021-08-02 20:56:45
【问题描述】:

我正在尝试使用复制语句将我在 Python 中创建的 CSV 复制到 PSQL 数据库,并收到错误 PostgreSQL: character with byte sequence 0xc2 0x81 in encoding “UTF8” has no equivalent in encoding “WIN1252”

原始文件是 UTF-8,我相当确定我创建并尝试复制的文件是用 UTF-8 编码的。我相信我在 Python 代码中添加了正确的参数:

def process_csvs():
    with open('movie_file.csv', mode='w', encoding='utf-8') as movie_file:
        movie_writer = csv.writer(movie_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
        with open('movie_basics.tsv', encoding='utf-8') as csv_file:
            csv_reader = csv.reader(csv_file, delimiter="\t")
            for row in csv_reader:
                ...

当我在记事本中打开输出文件时,它说编码是 UTF-8。

我的COPY语句如下:

COPY movies(movie_id, title, year, runningtime) FROM 'C:\Users\Public\Documents\movie_file.csv' DELIMITER ',' CSV HEADER NULL AS 'Nul
l';

我相信目前给我带来麻烦的字符是重音 A 在:tt0000676,Don Álvaro o la fuerza del sino,1908,Null

有人知道我的配置如何将它编码为 WIN1252 以及任何修复它的方法吗?谢谢!

编辑:

我重新创建了数据库:

CREATE DATABASE "scratch"
  WITH TEMPLATE template0
  ENCODING 'UTF8'
  LC_COLLATE = 'en_US.UTF-8'
  LC_CTYPE = 'en_US.UTF-8';

据我所知,所涉及的所有内容都以 UTF-8 编码,可能在命令行之外,我相信它默认为 WIN1252。我对这一切都很陌生。我确实尝试在我的 Python 脚本中使用 WIN1252 编码编写文件,但是原始数据是 UTF-8 编码的,并且脚本在尝试进行转换时抛出了错误。

【问题讨论】:

  • 我要说问题出在数据库编码端。什么版本的 Postgres,你在什么操作系统和版本上运行它?在psqlshow lc_collate;show lc_ctype; 返回什么?添加信息作为问题的更新。
  • 今天早上我花了几个小时在它上面工作,然后导入工作。但是,如果我想提出任何疑问,您在此处提到的内容似乎很重要。 lc_collat​​e 和 lc_ctype 都是 WIN1252,这似乎是我现在遇到相同错误的原因,但是将 UTF-8 转换回 1252 时出现问题。我已经看到了一些关于在创建数据库时设置语言环境的事情,并且会看起来现在进入它。谢谢!
  • 目前比较简单的方法似乎是在WIN1252中获取CSV文件。
  • 我确实将语言环境更改为 UTF-8,当我尝试进行查询时它给了我同样的错误。我无法获得编码为 WIN1252 的原始数据,而且我似乎找不到使用 Python 脚本将其转换为 WIN1252 的方法。就目前而言,我的数据在数据库中,我认为我的问题在于尝试从命令行进行查询,我认为我不需要这样做。我想我会把它留在这里。感谢您一直坚持我。
  • 错过了编辑我上一条评论的截止日期。澄清我无法在 Python 中成功转换某些字符,并说我将保留这个问题,因为当前的解决方案来自 pgAdmin,并且无法从 COPY 命令导入。

标签: python postgresql encoding


【解决方案1】:

感谢Adrian Klaver 一直支持我并最终将我指向这个post,它解释了如何在CMD 中更改Postgres 的编码和终端的活动代码页。之后 COPY 语句运行良好。

帖子中概述的步骤是:

  1. 打开cmd
  2. SET PGCLIENTENCODING=utf-8
  3. chcp 65001
  4. 登录 Postgres

对于任何对编码一无所知的人,CP65001(代码页 65001)是 Windows 指定 UTF-8 编码的方式。 SET PGCLIENTENCODING=utf-8 将 Postgres 中客户端的编码更改为 UTF-8,然后 chcp 65001 更改控制台的活动代码页以匹配它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2014-12-25
    • 2021-11-17
    • 2019-04-16
    • 2011-08-09
    • 1970-01-01
    相关资源
    最近更新 更多