我正在尝试使用pyodbc将中文字符插入MS SQL Server数据库。 在 SSMS 中运行以下查询会产生预期的结果:
INSERT INTO TestTable (testvalue) VALUES (N'面包');
SELECT * FROM TestTable;
testvalue
面包
但是,尝试对pyodbc进行相同的操作:
testvalue
é¢åŒ…
我做错了什么?这是我的pyodbc代码:
connection = pyodbc.connect(
f'Driver={{SQL Server}};CHARSET=UTF8;Server={SERVER};Database=Test;Trusted_Connection=yes'
)
connection.setencoding(encoding='utf-8')
connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
connection.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cursor = connection.cursor()
cursor.execute(
'''
INSERT INTO TestTable (testvalue) VALUES (N'面包');
'''
)
connection.commit()
testvalue
被定义为 nvarchar(50(。 我正在使用python 3.8。
提前感谢!
首先,使用参数化查询。
接下来,根据pyodbc Unicode页面:
Microsoft SQL Server
SQL Server 的最新驱动程序与规范匹配,因此无需配置。建议使用 pyodbc 默认值。
以下是将 Unicode 字符插入具有 nvarchar 列的 SQL Server 表所需的全部内容:
import pyodbc
connection = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};Server=(local);Database=StackOverflow;Trusted_Connection=yes;')
cursor = connection.cursor()
cursor.execute('INSERT dbo.TestTable (TestValue) values (?);', ('面包'))
connection.commit()
在Python 2.x中,你需要使用带有u
(Unicode(前缀u'面包'
的字符串文字,但这在Python 3.x中不是必需的。根据 Python 如何做 Unicode:
在 Python 3 中,只有一种字符串类型。它的名字是str,它是Unicode。
上面的代码已经过测试,可以与 Python 3.6.8 和 pyodbc-4.0.30 一起对抗 SQL Server 2017。