PSQL执行COPY导入UTF-8 CSV报错字符无WIN1252对应编码如何解决
报错原因
PostgreSQL的COPY命令默认使用客户端字符编码解析导入文件,而非直接使用数据库的编码。你在Windows环境下运行psql客户端,系统默认控制台编码为WIN1252,psql会继承该编码作为默认客户端编码。哪怕你的CSV文件、数据库均为UTF-8编码,客户端也会将传入的UTF-8文件按WIN1252解析,遇到WIN1252不支持的字符(如你提到的重音Á)时就会抛出编码转换错误。
修复方案
按操作便捷度排序,可选择以下任意一种方案:
- 直接在COPY语句中显式指定文件编码,无需修改其他配置,修改后的语句如下:
COPY movies(movie_id, title, year, runningtime) FROM 'C:\Users\Public\Documents\movie_file.csv' DELIMITER ',' CSV HEADER NULL AS 'Null' ENCODING 'UTF8';
- 每次启动psql后先执行编码设置语句,再运行COPY命令:
SET client_encoding = 'UTF8';
如果需要永久生效,可在Windows用户目录下新建psqlrc.conf文件,写入上述语句,后续启动psql时会自动加载该配置。
不建议尝试将Python输出的CSV改为WIN1252编码,该编码支持的字符范围远小于UTF-8,原始UTF-8数据中的很多特殊字符无法完成转换,会直接触发Python编码报错。
内容的提问来源于stack exchange,提问作者Stephen Carroll
相关产品推荐
相关产品推荐

