【问题标题】:SQLAlchemy with PostgreSQL Unicode issueSQLAlchemy 与 PostgreSQL Unicode 问题
【发布时间】:2012-10-15 13:16:45
【问题描述】:

我需要使用 SQLAlchemy 创建并连接到数据库 PostgreSQL 9.2。到目前为止,我能够在 UTF-8 中创建完整的数据库,但我无法将非 ASCII 字符放入其中。这就是我连接到数据库的方式:

url = URL(驱动程序名=s'postgresql',用户名='uname',密码='pwd',主机='localhost',端口='5432',数据库='postgres')
self.engine = create_engine(url)

然后我创建新的数据库,切换到它,并开始填充它:一切正常。我明白了:

entercursor.execute(语句,参数)
sqlalchemy.exc.DataError:(DataError)用于编码“UTF8”的无效字节序列:0xec2d43
'插入省份 (codice_regione, codice, tc_provincia_id, nome, sigla) 值 (%(codice_regione)s, %(codice)s, %(tc_provincia_id)s, %(nome)s, %(sigla)s)返回省.id' {'nome': 'Forl\xec-Cesena', 'codice': 40, 'codice_regione': 8, 'tc_provincia_id': 34, 'sigla': 'FC'}

我在 MySQL 5 上为同一个数据库提供了相同的代码,它运行良好。我不知道出了什么问题。我为 unicode 注册了 postgres 的扩展,但这不起作用。我很困惑,我需要更有经验的人的帮助。

【问题讨论】:

    标签: python mysql postgresql unicode orm


    【解决方案1】:

    确保您的数据(可以包含国际字符)是 Unicode 字符串。您尝试插入的字符串'Forl\xec-Cesena' 采用Latin1 (ISO-8859-1) 编码。所以使用

    unicode('Forl\xec-Cesena','Latin1')
    

    将其转换为 unicode 字符串。

    【讨论】:

      【解决方案2】:

      根据错误日志,0xec2d43 序列在 iso-8859-1 中对应于 3 个字符 ì-C,这将是名称“Forlì-Cesena”的一部分。

      所以程序发送的是有效的 iso-8559-1,而不是 UTF-8,而服务器需要 UTF-8。

      解决问题的最简单方法是通过在客户端发出以下 SQL 语句来通知服务器实际编码:

      SET client_encoding=latin1;
      

      或者在将数据传递到数据库之前将其转换为 UTF-8,这是@Tometzky 的答案。

      【讨论】:

      • 感谢您的回答,我在 create_engine 上添加了 encoding='latin1' ,当我将数据传递给我的 mapper 的 costructor 时,现在我收到此错误 return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError: 'utf8' codec can't decode byte 0xec in position 4: invalid continuation byte
      • @arpho client_encoding 影响从数据库返回的数据,以及数据库如何解释您发送给它的数据。因此,您必须将数据库中的数据解码为latin1iso-8859-1 而不是utf-8
      猜你喜欢
      • 2015-06-19
      • 2010-11-01
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多