如何在阅读时避免转换为ASCII

时间:2016-08-17 18:33:10

标签: python-2.7 ascii psycopg2 pypyodbc

我正在使用Python从SQL Server(pypyodbc)读取值并将它们插入PostgreSQL(psycopg2)

NAME字段中的值出现导致错误:

Montaño

该值存在于我的MSSQL数据库中(SQL_Latin1_General_CP1_CI_AS编码),可以使用PGAdmin和insert语句插入到我的PostgreSQL数据库中(UTF8)。

问题是使用python选择它会导致值转换为:

Monta\xf1o 

(xf1是'带有代字号的拉丁小写字母n的ASCII)

...在尝试插入PostgreSQL时会导致以下错误抛出:

invalid byte sequence for encoding "UTF8": 0xf1 0x6f 0x20 0x20

有没有办法避免将输入字符串转换为导致上述错误的字符串?

1 个答案:

答案 0 :(得分:1)

在Python_2下,你实际上想要执行从基本字符串到unicode类型的转换。所以,如果您的代码看起来像

sql = """\
SELECT NAME FROM dbo.latin1test WHERE ID=1
"""
mssql_crsr.execute(sql)
row = mssql_crsr.fetchone()
name = row[0]

然后您可能希望将基本latin1字符串(从SQL Server检索)转换为类型unicode,然后将其用作PostgreSQL INSERT的参数,即代替

name = row[0]
你会做的

name = unicode(row[0], 'latin1')