使用pyodbc连SQL Server遇sa登录失败(18456),凭据直接登录正常
我之前也碰到过一模一样的状况——明明用sa账号直接登录SQL Server完全没问题,但用pyodbc连接就抛出18456登录失败错误,结合你提到的Spark 3.0.0环境,给你整理几个排查和解决方向:
确认SQL Server的身份验证模式
首先得确保你的SQL Server开启了混合身份验证模式(SQL Server + Windows身份验证)。操作步骤:打开SSMS,右键目标服务器 → 「属性」→ 「安全性」,检查身份验证选项是否为混合模式。如果之前是仅Windows模式,修改后需要重启SQL Server服务才能生效。升级ODBC驱动版本
你当前用的是{ODBC Driver 13 for SQL Server},Spark 3.0.0对较新版本的ODBC驱动兼容性更稳定,建议换成{ODBC Driver 17 for SQL Server}或{ODBC Driver 18 for SQL Server}试试。修改后的连接字符串示例:connection_string = 'Driver={ODBC Driver 17 for SQL Server};Server=MyServer\\Server1,1433;Database=kockpit;uid=sa;pwd=*******'验证服务器地址与端口的准确性
仔细核对Server=MyServer\\Server1,1433这部分:- 如果是默认实例,直接写
Server=MyServer,1433即可,不用加实例名; - 如果是命名实例,确认实例名
Server1完全正确; - 检查1433是否是SQL Server实际监听的端口:打开SQL Server配置管理器 → 「SQL Server网络配置」→ 对应实例的「协议」→ 「TCP/IP」→ 「属性」,查看IP地址列表里的TCP端口。
- 如果是默认实例,直接写
确保允许远程连接
两步检查:- 在SQL Server配置管理器中,确认「SQL Server服务」处于运行状态,且「TCP/IP协议」已启用;
- 在SSMS中右键服务器 → 「属性」→ 「连接」,勾选「允许远程连接到此服务器」。
检查防火墙规则
确认服务器端防火墙允许1433端口的入站连接,或者你的客户端机器能正常访问该端口。可以用PowerShell命令测试连通性:Test-NetConnection MyServer -Port 1433如果测试失败,需要在防火墙里添加入站规则开放1433端口。
Spark环境的特殊注意事项
如果你是在Spark集群环境下运行代码,要确保所有工作节点都安装了对应版本的ODBC驱动;如果是本地模式,也需要在本地机器安装好驱动。另外,Spark的环境变量可能影响连接,必要时可以在代码中明确指定驱动路径,或者检查系统环境变量中的ODBC配置。密码特殊字符转义
如果你的sa密码包含特殊字符(比如@、#、$等),在连接字符串中需要正确转义。比如密码是P@ssw0rd,可以尝试用双引号包裹密码,或者转义特殊字符:connection_string = 'Driver={ODBC Driver 17 for SQL Server};Server=MyServer\\Server1,1433;Database=kockpit;uid=sa;pwd="P@ssw0rd"'
内容的提问来源于stack exchange,提问作者Aniket Roy

