我试图使用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进行操作。