阅读时如何避免转换为ASCII
How to avoid conversion to ASCII when reading
我正在使用 Python 从 SQL 服务器 (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
有什么方法可以避免将输入字符串转换为导致上述错误的字符串?
在 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 服务器检索)转换为 unicode
类型,然后再将其用作 Postgre[=25= 的参数] INSERT,即代替
name = row[0]
你会做
name = unicode(row[0], 'latin1')
我正在使用 Python 从 SQL 服务器 (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
有什么方法可以避免将输入字符串转换为导致上述错误的字符串?
在 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 服务器检索)转换为 unicode
类型,然后再将其用作 Postgre[=25= 的参数] INSERT,即代替
name = row[0]
你会做
name = unicode(row[0], 'latin1')