使用Python的pyodbc连接SQL Server时空用户登录失败报错如何解决
报错核心定位
你遇到的报错来自两个叠加的问题:
- 连接字符串存在SQL Server Native Client 11.0无法识别的无效属性,被驱动静默丢弃
- 因为账号相关配置被丢弃,驱动最终以空用户身份尝试登录SQL Server,触发18456登录失败错误
分步解决操作
- 修正连接字符串的参数命名,适配驱动的解析规则:
- 原写法的
username=fred不是驱动认可的有效键名,需替换为UID=fred(或等价写法*User ID=fred*) - 原写法的
password=test不是驱动认可的有效键名,需替换为PWD=test(或等价写法*Password=test*) - 移除冗余的冲突配置:
Trusted_Connection=no和Integrated security=false功能完全等价,同时存在容易触发解析异常,保留Trusted_Connection=no即可
- 原写法的
- 替换为修正后的连接代码:
conn = pyodbc.connect( r'Driver={SQL Server Native Client 11.0};' r'Server=12345.dcd_ba.weatherton.com;' r'Database=Dentrix;' r'Trusted_Connection=no;' r'UID=fred;' r'PWD=test;' ) return conn
- 修正参数后如果仍存在登录失败问题,按顺序排查:
- 确认SQL Server实例开启了SQL Server身份验证模式(不是仅Windows身份验证模式),
fred是该模式下创建的合法账号,未被锁定、未触发过期策略 - 确认
fred账号拥有Dentrix数据库的连接与访问权限 - 确认网络层可正常连通数据库服务器:测试服务器地址的1433端口是否可达,未被防火墙拦截
- 如驱动兼容性问题依旧存在,可将驱动替换为当前维护状态的
ODBC Driver 17 for SQL Server,连接字符串参数规则完全一致
- 确认SQL Server实例开启了SQL Server身份验证模式(不是仅Windows身份验证模式),
SQL Server系列ODBC驱动的解析特性为:遇到无法识别的连接字符串参数时,不会直接中断连接流程,只会将无效参数静默剔除,最终基于剩余的有效配置发起连接。这也是为什么你明明写了账号密码,却看到报错里的登录用户是空字符串的核心原因。
内容的提问来源于stack exchange,提问作者Ace Cabbie
相关产品推荐
相关产品推荐

