我面临的问题与此处发布的SQLAlchemy和UnicodeDecodeError相同。当我从表中获取结果时,出现错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
提出的两种解决方案是在python中使用sy.setdefaultencoding('utf8') 并将其他字符集参数传递给连接字符串,如下所示:
conn_str='postgresql+psycopg2://'+str(dbhost)+':' + str(port) + '/postgres?charset=utf8'
这两种解决方案似乎都不能解决问题。我还可以调试什么?该表基本上是各个国家的 GIS 数据。所以桌子有特殊性。
似乎编码因服务器而异。您可以通过以下命令验证这一点:
SHOW client_encoding; --Equivalent to: SELECT current_setting('client_encoding');
SHOW server_encoding; --Equivalent to: SELECT current_setting('server_encoding');
PostgreSQL 自动转换为客户端编码。在您的环境中,两者可能不同。您可以通过多种方式配置client_encoding
:
- 在应用程序中打开连接时使用
SET
命令:SET client_encoding = 'UTF-8';
- 在应用程序中打开连接时使用
set_config
功能:SELECT set_config('client_encoding', 'UTF-8', true);
- 在操作系统中配置
PGCLIENTENCODING
环境变量:export PGCLIENTENCODING=UTF8
- 在 postgres 配置文件中编辑
client_encoding
- 使用
ALTER SYSTEM
(之后必须使用SELECT pg_reload_conf();
刷新配置):ALTER SYSTEM SET client_encoding = 'UTF-8';
更新:不幸的是,无法从SQL_ASCII启用自动转换。
如果客户端字符集定义为SQL_ASCII,则编码 无论服务器的字符集如何,转换都将被禁用。只 至于服务器,除非您正在工作,否则使用SQL_ASCII是不明智的 包含所有 ASCII 数据。
引用自Postgres文档。