Pyodbc MS SQL Server - 中文变成了胡言乱语。

问题描述 投票:0回答:1

我试图使用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.

先谢谢你

sql-server pyodbc
1个回答
1
投票

首先,使用参数化查询。

接下来,按照 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进行操作。

© www.soinside.com 2019 - 2024. All rights reserved.