Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQL炼金术与PostgreSQL Unicode问题_Python_Mysql_Postgresql_Unicode_Orm - Fatal编程技术网

Python SQL炼金术与PostgreSQL Unicode问题

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 然后我创建新的

我需要使用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'}


我在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。