SQLAlchemy和Postgres UnicodeDecodeError

时间:2017-05-09 16:13:12

标签: python postgresql sqlalchemy python-unicode

我面临的问题与此处SQLAlchemy and UnicodeDecodeError发布的问题相同。当我从表中获取结果时,我收到错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

提出的两个解决方案是在python中使用sy.setdefaultencoding(' utf8') 并将其他charset参数传递给连接字符串,如下所示:

conn_str='postgresql+psycopg2://'+str(dbhost)+':' + str(port) + '/postgres?charset=utf8'

这两种解决方案似乎都无法解决问题。我还可以调试什么?该表基本上是各国的GIS数据。因此表格具有特殊性。

1 个答案:

答案 0 :(得分:0)

似乎编码因服务器而异。您可以验证这个命令:

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 documentation