pyodbc如何传递nvarchar类型参数解决SQL Server特殊字符匹配问题
问题根因
你遇到的问题本质是pyodbc默认将Python字符串参数映射为SQL Server的varchar类型,非ASCII字符会在类型转换时丢失编码信息,导致查询匹配不到结果,只要让驱动把对应参数按nvarchar类型传递即可解决。
解决方案
方法1:修改数据库连接配置(推荐)
在pyodbc连接SQL Server的连接字符串中添加CHARSET=UTF8参数,示例代码如下:
import pyodbc conn = pyodbc.connect( "DRIVER={ODBC Driver 17 for SQL Server};" "SERVER=你的服务器地址;" "DATABASE=你的数据库名称;" "UID=登录账号;" "PWD=登录密码;" "CHARSET=UTF8;" # 新增该配置项 )
配置完成后,pyodbc传递的所有字符串参数都会默认按Unicode编码对应SQL Server的nvarchar类型,你现有的cursor.execute(query, paramValues)代码无需修改即可直接运行。
方法2:手动指定参数为nvarchar类型
如果不方便修改全局连接配置,可以针对需要传nvarchar的参数单独指定SQL类型,将对应参数包装为(类型标识, 值)的元组即可:
import pyodbc from pyodbc import SQL_WVARCHAR alertTypeName = "Boli şi Dăunători" paramValues = [ syswinAlertId, code, (SQL_WVARCHAR, alertTypeName), # 明确指定该参数为nvarchar类型 alertMessage, createdBy, modifiedBy ] cursor.execute(query, paramValues)
注意事项
- 不要手动给查询语句中的参数加
N前缀,参数化查询的参数类型由驱动或显式指定的类型决定,硬加N前缀反而会导致参数绑定失效 - 不要用字符串拼接的方式把参数写入SQL语句,既存在SQL注入风险,也会导致编码处理异常
内容的提问来源于stack exchange,提问作者Bogdan Cupcea
相关产品推荐
相关产品推荐

