Python3、pyodbc、sqlserver:根据需要提供Unicode和ANSI字符串

Python3、pyodbc、sqlserver:根据需要提供Unicode和ANSI字符串,python,sql-server,python-3.x,unicode,pyodbc,Python,Sql Server,Python 3.x,Unicode,Pyodbc,我使用Python,目前使用的是Python3,来访问具有ANSI char/varchar列/索引的旧式(读“不会更改”)数据库 我刚刚发现一个主要的性能问题(对于我完全控制的新数据库),通过将数据库转换为nchar/nvarchar()解决了,这样我的查询、列和索引都可以使用Unicode 这就引出了一个问题,到目前为止,我还无法用谷歌搜索它,我如何在Python3中为pyodbc提供一个非Unicode字符串,以便它将该字符串作为非Unicode字符串正确地传递给ODBC/SQL Serv

我使用Python,目前使用的是Python3,来访问具有ANSI char/varchar列/索引的旧式(读“不会更改”)数据库

我刚刚发现一个主要的性能问题(对于我完全控制的新数据库),通过将数据库转换为nchar/nvarchar()解决了,这样我的查询、列和索引都可以使用Unicode

这就引出了一个问题,到目前为止,我还无法用谷歌搜索它,我如何在Python3中为pyodbc提供一个非Unicode字符串,以便它将该字符串作为非Unicode字符串正确地传递给ODBC/SQL Server?这对许多应用程序(如数据挖掘应用程序)的性能有重大影响

这似乎有效,但它正确吗

conn = pyodbc.connect( connection_string )
curr = conn.cursor()
aString = 'Howdy!'
query = 'select * from aTable where aColumn = ?'
results = curr.execute( q, [aString.encode('ascii')] )
或者/另外,在SQL Server中的非Unicode列上构建Unicode索引是否更合适和/或更可能?(我对数据库有足够的控制来添加索引)

对吗

conn = pyodbc.connect( connection_string )
curr = conn.cursor()
aString = 'Howdy!'
query = 'select * from aTable where aColumn = ?'
results = curr.execute( q, [aString.encode('ascii')] )
根据SQL Profiler和SQL Server Management Studio(SSMS)在Windows下使用SQL Server ODBC进行测试时所说的,假设字符串值真的将被限制为ASCII字符,情况似乎是这样

如果我们只是将
[aString]
作为查询参数传递,SQL Profiler将显示pyodbc发送此消息

exec sp_prepexec@p1 output,N'@p1 nvarchar(6)”,N'select*从一个表中,其中aColumn=@p1',N'Howdy!'
如果我们要求SSMS向我们展示

从表中选择*,其中aColumn=N'Howdy!'
它告诉我们它希望进行索引扫描

但是,如果我们将
[aString.encode('ascii')]
作为查询参数传递,SQL Profiler将显示pyodbc发送此消息

exec sp_prepexec@p1 output,N'@p1 varbinary(6)”,N'select*从数据表中,其中aColumn=@p1',0x486F77647921
如果我们要求SSMS向我们展示

从数据表中选择*,其中aColumn=0x486F77647921
它告诉我们它希望进行索引查找


“搜索”通常比“扫描”好,因此,如果查询实际返回正确的结果,我希望使用编码参数会有更好的性能。

您在实验中进一步验证了我的“证明它有效”,但您的答案并不令人满意。我尤其有点害怕SQL Server将查询视为varbinary而不是varchar/char。最后,我想知道如何正确地向ANSI数据库提供ANSI字符串,以及/或者如何针对Unicode查询对ANSI数据库进行性能保护。但是,Python3没有“普通”(非Unicode)字符串,只有
字符串(对于Unicode)和
字节(对于非Unicode)。