2

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

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

Montaño

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

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

Monta\xf1o 

(xf1 是 'Latin small letter n with tilde' 的 ASCII 码)

...这导致尝试插入 PostgreSQL 时引发以下错误:

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

有什么方法可以避免将输入字符串转换为导致上述错误的字符串?

4

1 回答 1

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')
于 2016-08-18T00:36:53.613 回答