1

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

url = URL(drivername=s'postgresql', username='uname', password='pwd', host='localhost', port='5432', database='postgres')
self.engine = create_engine(url)

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

entercursor.execute(statement, parameters) sqlalchemy.exc.DataError
: (DataError) invalid byte sequence for encoding "UTF8": 0xec2d43
'INSERT INTO Province (codice_regione, codice, tc_provincia_id, nome, sigla) VALUES (%(codice_regione)s, %(codice)s, %(tc_provincia_id)s, %(nome)s, %(sigla)s) RETURNING Province.id' {'nome': 'Forl\xec-Cesena', 'codice': 40, 'codice_regione ':8,'tc_provincia_id':34,'sigla':'FC'}

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

4

2 回答 2

3

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

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

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

SET client_encoding=latin1;

要么将数据转换为 UTF-8,然后再将其传递给数据库,这是@Tometzky 的答案。

于 2012-10-25T12:45:38.063 回答
1

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

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

将其转换为 unicode 字符串。

于 2012-10-25T11:52:27.820 回答