Python SQL炼金术与PostgreSQL Unicode问题
我需要使用SQLAlchemy创建并连接到PostgreSQL 9.2数据库。到目前为止,我能够在UTF-8中创建完整的数据库,但在将非ASCII字符放入数据库时遇到了困难。以下是我连接数据库的方式: url=URLdrivername=s'postgresql',username='uname',password='pwd',host='localhost',port='5432',database='postgres' self.engine=create_engineurl 然后我创建新的数据库,切换到它,并开始填充它:一切正常。我明白了: entercursor.executestatement,参数 sqlalchemy.exc.DataError:DataError编码UTF8的字节序列无效:0xec2d43 '插入省codice_regione、codice、tc_provincia_id、nome、sigla值%codice_Regions、%codice、%tc_provincia_id、%nomes、%siglas返回省。id'{'nome':'Forl\xec Cesena','codice':40,'codice_regione':8,'tc_provincia_id':34,'sigla':'FC'}Python SQL炼金术与PostgreSQL Unicode问题,python,mysql,postgresql,unicode,orm,Python,Mysql,Postgresql,Unicode,Orm,我需要使用SQLAlchemy创建并连接到PostgreSQL 9.2数据库。到目前为止,我能够在UTF-8中创建完整的数据库,但在将非ASCII字符放入数据库时遇到了困难。以下是我连接数据库的方式: url=URLdrivername=s'postgresql',username='uname',password='pwd',host='localhost',port='5432',database='postgres' self.engine=create_engineurl 然后我创建新的
我在MySQL 5上为同一个db编写了相同的代码,它工作得非常好。我不知道怎么了。我为unicode注册了postgres的扩展,但这不起作用。我很困惑,我需要更有经验的人的帮助。确保您的数据(可以包含国际字符)是Unicode字符串。您尝试插入的字符串“Forl\xec Cesena”采用拉丁文ISO-8859-1编码。所以使用
unicode('Forl\xec-Cesena','Latin1')
将其转换为unicode字符串。请确保可以包含国际字符的数据是unicode字符串。您尝试插入的字符串“Forl\xec Cesena”采用拉丁文ISO-8859-1编码。所以使用
unicode('Forl\xec-Cesena','Latin1')
将其转换为unicode字符串。根据错误日志,0xec2d43序列在iso-8859-1中对应于3个字符ì-C,这将是名称“Forlì-Cesena”的一部分
因此,程序发送的是有效的iso-8559-1,而不是UTF-8,而服务器需要UTF-8
解决此问题的最简单方法是通过在客户端发出以下SQL语句,将实际编码告知服务器:
SET client_encoding=latin1;
根据错误日志,0xec2d43序列在iso-8859-1中对应于3个字符ì-C,这将是名称“Forlì-Cesena”的一部分
因此,程序发送的是有效的iso-8559-1,而不是UTF-8,而服务器需要UTF-8
解决此问题的最简单方法是通过在客户端发出以下SQL语句,将实际编码告知服务器:
SET client_encoding=latin1;
或者在将数据传递到数据库之前将其转换为UTF-8,这是@Tometzky的答案。感谢您的回答,我在create_引擎上添加了encoding='latin1',当我将数据传递给映射器的构造函数时,现在我得到了这个错误返回codecs.UTF_8decodeInput,errors,True UnicodeDecodeError:“utf8”编解码器无法对位置4中的字节0xec进行解码:继续无效byte@arpho客户机_编码影响从数据库返回的数据,以及数据库如何解释您发送给它的数据。因此,您必须将DB中的数据解码为latin1或iso-8859-1,而不是utf-8。感谢您的回答,我在create_引擎上添加了编码='latin1',当我将数据传递给我的映射器的构造函数时,现在我得到这个错误返回codecs。utf_8_decodeinput,errors,True UnicodeDecodeError:“utf8”编解码器无法对位置4中的字节0xec进行解码:继续无效byte@arpho客户机_编码影响从数据库返回的数据,以及数据库如何解释您发送给它的数据。因此,您必须将数据库中的数据解码为latin1或iso-8859-1,而不是utf-8。