Pyodbc MS SQL 服务器 - 中文变成乱码

Pyodbc MS SQL Server - Chinese turns into gibberish

我正在尝试使用 pyodbc 将中文字符插入到 MS SQL 服务器数据库中。 运行 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 page

Microsoft SQL Server

SQL Server's recent drivers match the specification, so no configuration is necessary. Using the pyodbc defaults is recommended.

以下是将 Unicode 字符插入具有 nvarchar 列的 SQL 服务器表所需的全部内容:

import pyodbc
connection = pyodbc.connect('Driver={ODBC Driver 17 for SQL Server};Server=(local);Database=Whosebug;Trusted_Connection=yes;')
cursor = connection.cursor()
cursor.execute('INSERT dbo.TestTable (TestValue) values (?);', ('面包'))
connection.commit()

在 Python 2.x 中,您需要使用带有 u (Unicode) 前缀的字符串文字,u'面包',但这在 Python 3.x。根据 How Python does Unicode:

In Python 3, there is one and only one string type. Its name is str and it’s Unicode.

以上代码已通过 Python 3.6.8 和 pyodbc-4.0.30 针对 SQL Server 2017 的测试。