You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pyodbc连SQL Server遇sa登录失败(18456),凭据直接登录正常

Fixing "Login failed for user 'sa' (18456)" with pyodbc (Spark 3.0.0 Environment)

我之前也碰到过一模一样的状况——明明用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端口。
  • 确保允许远程连接
    两步检查:

    1. 在SQL Server配置管理器中,确认「SQL Server服务」处于运行状态,且「TCP/IP协议」已启用;
    2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 21:27:48