
Navicat 连接 SQL Server这件事听起来简单点两下输入 IP 输密码的事。但我这些年帮同事、帮群友排过的连接故障少说也有三四十起绝大多数人都卡在同一个地方SQL Server 装好了Navicat 也装好了偏偏就是连不上。奇怪的是SSMS 能连上Navicat 连不上局域网能连上跨机器连不上默认实例能连上命名实例又连不上。每次排查到最后问题基本都集中在协议、端口、驱动、认证这四类事情上。这篇文章不讲虚的直接把连接前必须确认的清单、连接时的参数怎么填、常见报错到底在说什么、以及连上之后怎么提升效率全部掰开揉碎讲清楚。不管你是刚接触 SQL Server 的运维新人还是被连接问题折磨了一下午的开发者这篇都值得读完。1. 连接前的三个硬性前提少一个都白搭1.1 服务都没跑起来谈连接纯属空谈很多人一上来就在 Navicat 里填 IP、输账号却忽略了最基础的一件事SQL Server 服务到底有没有在运行。SQL Server 的服务名通常是MSSQLSERVER默认实例如果是命名实例服务名会变成MSSQL$实例名这种格式。Windows 下打开services.msc找到对应服务看一眼状态列这一步花不了三十秒但能过滤掉一大批低级问题。我遇到过一个很典型的场景同事说 Navicat 连不上 SQL Server报错信息是目标服务器积极拒绝无法连接。我远程登录服务器一看SQL Server 服务根本没启动原因是服务器重启过一次服务没有设置自动启动。这种问题如果不先查服务状态后面测端口、查防火墙全是白费功夫。所以排查顺序应该是先确认服务活着再往下走。如果你连服务器都没法远程登录那就更简单了直接在 Navicat 连接失败之后问对方一句服务器上 SQL Server 服务亮着吗很多时候这一句就能解决问题。SQL Server 服务不一定装完就会自启尤其是用某些精简安装包、绿色版、或者被安全软件拦截过的环境服务的启动类型经常是手动甚至禁用。1.2 默认实例和命名实例先把目标身份弄清楚SQL Server 的实例概念是很多新手的第一道坎。默认实例只有一个名字就是机器名连接时直接填 IP 或主机名就行端口默认 1433。命名实例则是在安装时指定的名字比如SQLEXPRESS、SQL2016连接的时候要写成主机名\实例名或者IP\实例名。这里有个很容易混淆的点同一台机器上可以同时装多个 SQL Server 实例默认实例占着 1433命名实例通常不会再用 1433而是动态分配一个随机端口。很多人在 Navicat 里对着命名实例填了 IP 加 1433连不上就开始怀疑防火墙实际上这个方向上就错了。从运维角度说连接前先搞清楚我连的是哪台机器上的哪个实例比什么都重要。Navicat 的界面上有主机/IP和端口两个字段如果填192.168.1.50\SQL2016这种带实例名的主机格式端口就要留空或者填 1433 之外的动态端口。如果填192.168.1.50那就默认是 1433 的默认实例。这两种填法对应完全不同的解析路径填错了报错内容也完全不同。1.3 TCP/IP 协议没启用Navicat 连门都摸不到SQL Server 安装完成后网络协议并不一定都是开启的。默认情况下 SQL Server 会启用 Shared Memory、TCP/IP 和 Named Pipes但很多定制化安装、企业安全基线、或者某些云镜像里的 SQL Server会把 TCP/IP 协议直接禁用。Navicat 作为外部客户端走的就是 TCP/IP 这条链路Shared Memory 只在同一台机器上的本地工具才有效Named Pipes 跨机器配置麻烦且性能一般。所以只要 TCP/IP 是禁用的Navicat 无论如何都连不上。检查位置在SQL Server 配置管理器里SQL Server 网络配置- 对应实例的协议找到TCP/IP右键启用。改完之后千万不要忘记重启 SQL Server 服务协议配置不会热生效。我见过不止一个开发环境SSMS 能连上是因为 SSMS 在同一台服务器上用 Shared Memory 走的是本地连接而 Navicat 在这台服务器上也是用 TCP 连接协议被禁用之后表现就是本地也连不上。这类场景最容易让人困惑明明同一个账号同一个实例为什么 SSMS 可以 Navicat 不行答案往往就是协议问题。1.4 防火墙和端口放行远程连接翻车重灾区本机能连远程连不上、或者换一台机器就连不上基本可以锁定是防火墙或端口没有放行。SQL Server 默认监听 1433 端口Windows 防火墙默认情况下会拦截外部 TCP 连接所以要么在防火墙设置里加一条入站规则放行 1433要么用一条命令解决netsh advfirewall firewall add rule nameSQL Server 1433 dirin actionallow protocolTCP localport1433如果机器上跑着别的安全软件企业杀毒、安全组策略这些规则也要同步检查。云服务器更别说了除了 Windows 防火墙还要去安全组里放行 1433经常有人本地啥都通了到了云端就是连不上最后发现是安全组没加规则。测试端口通不通我习惯用 PowerShell 的Test-NetConnectionTest-NetConnection 192.168.1.100 -Port 1433返回TcpTestSucceeded : True就说明端口通了。老一点的系统也可以直接telnet 192.168.1.100 1433黑窗口不退出就说明连上了。这个检查结果能帮你把问题快速分成两半端口通不通通了就往账号和认证方向查不通就往防火墙和协议方向查。2. 驱动选不对版本再新也白搭2.1 Navicat 连接 SQL Server 时真正干活的是连接驱动很多人不知道Navicat 自己不会直接跟 SQL Server 对话它内部还是通过微软提供的连接组件来建立连接的。Windows 上常见的是SQL Server Native Client、ODBC Driver for SQL Server、OLE DB Provider for SQL Server这些驱动Navicat 在不同版本、不同平台下会调用不同的底层组件。这意味着一个很实际的问题驱动太旧新版本的 SQL Server 可能不认驱动太新老版本的 SQL Server 也可能带不动。那些SQL Server 2008 能连2019 连不上或者反过来2019 能连2008 连不上的诡异现象相当一部分就是驱动版本和数据库版本不匹配造成的。Navicat 的版本也会影响底层驱动太老的 Navicat 版本在连接 SQL Server 2017 之后的实例时可能根本没有对应的新驱动组件只能靠系统里额外安装 ODBC Driver 来补。所以如果你发现 Navicat 连不上但系统里的 SQL Server 管理工具连得上不妨去检查一下 Navicat 的版本是不是太老或者所在机器上缺少新版 ODBC 驱动。2.2 一张表理清常见驱动与 SQL Server 版本的匹配关系驱动这种事记一堆名字没用关键是知道哪类驱动大概覆盖什么年代和版本。下面是我自己整理的一张常用对照表大致按时间线排的驱动组件常见年代主要兼容范围典型报错特征SQLOLEDB很老的项目SQL Server 2000/2005连接老库时能用但新的加密特性不支持SQLNCLI10.0/11.02008~2012 时代SQL Server 2000~2012连新版 SQL Server 时可能出现不受支持ODBC Driver 11/132012~2016 时代SQL Server 2008 / Azure老驱动在 TLS 1.2 环境会有兼容问题ODBC Driver 172018 前后SQL Server 2008~2019 / Azure整体最稳但新版加密逻辑也有注意点ODBC Driver 182022 前后SQL Server 2012 / Azure默认强制加密证书不信任时直接报错这张表的重点不是让你背型号而是让你遇到连接问题时有一个判断框架。比如你连的是 2019 年的 SQL Server机器上只有老掉牙的 SQLOLEDB那连接出问题就是大概率事件反过来连的是 SQL Server 2008 古董库却装了一堆新驱动也可能会因为加密和 TLS 配置不匹配翻车。Navicat 比较少直接在界面上告诉你我正在使用哪个驱动但可以通过报错前缀来判断。报错开头带[Microsoft][ODBC SQL Server Driver]或者[Microsoft][ODBC Driver 17 for SQL Server]之类的内容就能看出底层走的是什么连接组件然后再去判断这个驱动是否和数据库版本兼容。2.3 从报错关键词反推驱动现场排查才有方向有一次我在群里看到一个朋友发截图Navicat 连接 SQL Server 2019报错很长核心句子是证书链是由不受信任的颁发机构颁发的。0x80090328。他第一反应是跑去关防火墙、改端口折腾了半小时没结果。我让他看一眼报错前缀截图里明确显示是[Microsoft][ODBC Driver 18 for SQL Server]。这就基本锁定了方向ODBC Driver 18 默认强制加密而 SQL Server 端用的是自签名证书客户端又不信任这个证书所以连接被 TLS 层拦住了。这种问题不用去碰防火墙解决思路是在 SQL Server 端关闭强制加密或者在连接配置里选择信任服务器证书。Navicat 连接编辑界面的使用加密相关选项如果版本支持就直接关掉或者改成如果可行则加密这类宽松模式。还有一些环境里 SQL Server 配置管理器里有个强制加密选项被勾上了把它取消也能绕过去。反过来报错里出现未发现数据源名称这种话说明驱动组件本身都没配置好优先检查机器上是否装了对应的 ODBC 驱动是不是 32 位和 64 位混用了。这类问题不太常见但一旦出现就很容易绕远路因为你以为在排查怎么连不上其实是在排查驱动根本不存在。3. 新建连接的完整操作流程参数逐个说明3.1 从 SQL Server 配置管理器拿到准确的端口和实例信息我先说一个容易忽略的习惯不要凭记忆填端口不要凭印象填实例名所有信息都应该从服务器上的 SQL Server 配置管理器里拿或者用命令确认。在配置管理器里SQL Server 网络配置- 对应实例的协议 - 双击 TCP/IP看IP 地址标签页的最下面IPAll部分TCP 动态端口如果是 0说明这个实例使用的是动态端口每次重启可能会变化。TCP 端口如果写了具体数值比如 1433说明被固定成了 1433。这个区别非常关键。默认实例一般固定 1433命名实例很多是动态端口。如果你在 Navicat 里看到的是主机/IP和端口分离的填法那么对于动态端口的命名实例最稳妥的方式是先在 SQL Server 端把TCP 动态端口清空在TCP 端口里填上一个固定的端口号然后重启服务之后 Navicat 用 IP固定端口连就再也不怕解析问题了。还有一种更快速的确认方式直接在服务器上跑netstatnetstat -ano | findstr 1433能看到监听端口的进程 PID再跟任务管理器里的 PID 对上号就知道当前 SQL Server 到底监听在哪个端口上。这个信息比任何文档都准确。3.2 Navicat 新建连接表单每个字段该填什么Navicat 里选择连接类型为SQL Server会弹出一个表单核心字段就这么几个但每个都值得说明白。下面是我实际填写时的经验参考字段推荐填法说明连接名你自己看得懂的名字建议写库用途-环境-IP例如订单库-测试-192.168.1.50主机/IPIP、主机名、或 IP\实例名默认实例填 IP命名实例填 IP\实例名端口1433 或实际固定端口默认实例填 1433命名实例建议填固定后的端口初始数据库可留空或填具体库名留空默认连 master填库名可直连目标库用户名sa 或 Windows 账号SQL Server 认证用 saWindows 认证填域账号密码对应密码注意密码中的特殊字符在部分环境下要小心使用加密按实际环境选新版驱动加密问题多按 SQL Server 端策略来配关于主机/IP字段Navicat 和 SSMS 的填法略有差异。SSMS 支持在服务器名里直接写192.168.1.50,1433\SQL2016这种复杂写法Navicat 则是把主机和端口分开更清晰。对于命名实例如果 Navicat 能通过 SQL Browser 服务解析端口填192.168.1.50\SQL2016也行但 SQL Browser 被禁用或网络策略不允许 UDP 1434 的情况下解析会失败。所以我更推荐把命名实例的端口在 SQL Server 端固定下来然后主机填 IP端口填固定值绕开 SQL Browser 依赖。3.3 认证方式选择与 sa 账号启用步骤SQL Server 安装时默认通常只启用 Windows 身份验证模式这时候你在 Navicat 里用 sa 去连一定会报用户 sa 登录失败。很多人第一反应是密码错了其实根本不是是 SQL Server 压根不允许 SQL Server 身份验证。处理的完整步骤是用 Windows 认证方式登录 SSMS。右键服务器根节点 - 属性 - 安全性 - 选择SQL Server 和 Windows 身份验证模式确定。左侧安全性 - 登录名 - 找到 sa右键属性 - 设置一个新密码。切到状态页把登录从禁用改为启用。重启 SQL Server 服务让认证模式生效。重启服务这一步容易漏我见过有人在 SSMS 里改完认证模式就直接用 sa 去连结果还是报错折腾了一圈才发现服务没重启。另外如果是在生产环境启用 sa 之前一定要想清楚安全策略sa 是超级账号密码要足够强并且最好限制来源 IP。至少在端口层面做一层防火墙限制不要让 1433 对公网裸奔。Windows 认证在 Navicat 里也能用走的是当前操作系统的登录身份常见于公司内网和域环境。如果你是个人电脑远程连一台开发机的 SQL Server建议直接用 SQL Server 认证少踩域信任相关的坑。3.4 测试连接前先用 sqlcmd 自证 SQL Server 可用Navicat 报了连接错误之后不要急着反复点连接按钮。先用更底层的工具验证一遍SQL Server 本身到底能不能被连上。Windows 上如果没有 SSMS可以用sqlcmd这个命令行工具sqlcmd -S 192.168.1.100,1433 -U sa -P 你的密码 -d master -Q SELECT VERSION如果这条命令能正常输出 SQL Server 版本信息说明网络、端口、账号密码、认证模式全都是通的问题就出在 Navicat 这一层的驱动或配置上如果这条命令也连不上那报错内容就是判断方向的依据错误码和错误状态码能帮你把问题范围缩小很多。这个习惯的好处是它把Navicat 的问题和SQL Server 的问题彻底切开。很多人在 Navicat 里变着花样改配置改了半天发现 SQL Server 账号本身就被锁了或者密码有大写字母大小写搞错了这些用 sqlcmd 一测就能暴露出来。4. 高频连接报错的完整排查链路4.1 先看报错文本常见错误码到底在说什么连接报错看起来五花八门实际归类下来就那么几类。我把最常碰到的几个错误整理成了一张表后面排查时可以直接照着定位报错关键词 / 错误码含义排查方向错误 26 - 定位指定的服务器/实例时出错网络层面找不到目标机器或实例ping、检查实例名、检查 SQL Browser错误 40 - 无法打开到 SQL Server 的连接TCP 连接层面失败防火墙、端口、SQL Server 服务是否运行用户 sa 登录失败。错误 18456认证失败了但原因要看状态码认证模式、sa 是否禁用、密码是否正确SSL Provider - 证书链是有不受信任的颁发机构颁发的加密协商失败证书不受信任关闭强制加密、选择信任服务器证书已成功与服务器建立连接但登录过程中发生错误网络通了认证阶段被拦账号锁定、密码策略、登录权限连接超时默认设置已过期链路丢包或端口不同网络波动、防火墙丢包、驱动超时这张表的价值在于按图索骥。看到错误 26 就别去折腾账号密码看到 18456 就别去拆防火墙。很多人排查效率低就是因为没有先看报错类型而是凭直觉把所有可能都试一遍。4.2 典型案例SSMS 能连但 Navicat 连不上一步步缩小范围有一次生产环境的事故排查让我印象特别深。同事报障说 Navicat 连不上测试库但 SSMS 在同一台机器上能连。到了那台机器上我先用 sqlcmd 测了一下本机 IP 加 1433结果确实连上了。这说明 SQL Server 本身没问题那问题就出在 Navicat 的连接参数或者驱动层面。我打开 Navicat 的连接配置看到主机填的是192.168.1.50\SQL2016端口留空用户名密码看着也对但连接时一直报错误 26。这个错误指向实例解析于是我上服务器查了一下 SQL Browser 服务发现它被设定成禁用状态。为什么 SSMS 能连而 Navicat 不能因为 SSMS 在实例解析失利时会有回退机制而 Navicat 更依赖标准解析流程当 SQL Browser 不响应时命名实例的动态端口就无从解析。解决方式有两种要么把 SQL Browser 服务设为自动并启动要么把 SQL2016 的端口固定下来用 IP端口连。我用的是第二种。打开 SQL Server 配置管理器把 TCP/IP 里的IPAll - TCP 动态端口清空TCP 端口填了 14330重启服务然后把 Navicat 的主机改成192.168.1.50端口改成14330一次通过。这个案例说明了排查链路的重要性从 Navicat 到 SQL Server中间隔着驱动、实例解析、TCP、端口、认证多层每一层都有各自的报错特征。先确认哪一层出了问题不要盲目改配置。4.3 连接特别慢或者超时问题往往不在账号而在链路还有一种情况报错不是立刻出现而是等了几十秒才弹连接超时。这个现象特别有迷惑性因为账号、密码、实例名这些配置错了往往秒报错而超时恰恰说明请求已经发出去了但响应一直没回来或者中间链路在丢包。常见原因有三个第一个是客户端和服务器之间有防火墙做丢包而不是拒绝表现为 ping 能通、端口偶尔能通但 Navicat 等半天超时第二个是 SQL Server 启用了强制加密但证书协商过程被安全软件拦截第三个是 DNS 解析慢Navicat 填的是主机名而不是 IP每次解析要等很久。处理方式也很直接先换成 IP 地址连接排除 DNS 因素然后持续 ping 服务器看是否有丢包ping -t挂一会再用Test-NetConnection连续测端口稳定性。如果端口时通时不通就抓防火墙和安全组别在 Navicat 里浪费时间调超时参数。4.4 多实例环境动态端口与 SQL Browser 的那些坑一台服务器装了多个 SQL Server 实例的情况下动态端口的问题会特别明显。每次实例重启动态端口都可能变SQL Browser 服务负责把实例名翻译成当前端口但如果 SQL Browser 挂了、被防火墙拦了、或被安全软件禁了所有依赖实例名解析的客户端都会失灵。我在一台上同时跑着三个实例的服务器上就吃过这个亏。某个实例升级打补丁重启后原来的动态端口变了但运维那边记的还是旧端口Navicat 连接配置里的端口是手写的直接连到另一个实例上去了。虽然连上了但连错了库比连不上还危险。所以多实例环境下我的建议很明确所有要给外部客户端用的 SQL Server 实例都手动分配一个固定端口并在运维文档里记录清楚。实例名动态端口这套机制对于临时调试很方便但对于需要长期稳定连接的应用来说动态就是最大的不稳定因素。Navicat 连接配置里如果用了命名实例方式也尽量在备注里写上实际 IP 和端口方便以后排查。5. 连上之后让 Navicat 真正提高日常效率5.1 连接分组与命名规范多环境切换不再头疼连接问题解决之后接下来就是日常使用习惯。Navicat 支持把连接按文件夹分组我强烈建议在第一天就把分组建好。我的分组习惯是开发环境、测试环境、预发环境、生产环境然后再按业务模块细分。连接名的格式采用用途-环境-服务器比如订单中心-测试-192.168.1.50。命名规范听起来是小事但实际用起来价值很大。我见过有人把所有连接都叫SQL Server一眼看过去十几个同名连接根本分不清哪个对应哪个环境。到了生产环境误操作心态直接爆炸。所以每次新建连接多花十秒钟写清楚名字和备注半年后你会感谢自己。如果涉及敏感的账号密码不建议在共享电脑上勾选保存密码。Navicat 保存的密码虽然是加密的但在多人共用的电脑上这种便利带来的风险远大于收益。5.2 把备份、同步、查询玩起来Navicat 的功能远不止于能连上但很多人连上之后就只拿它当查询器用。SQL Server 的日常运维如果用 Navicat 来做有几个功能是值得认真用起来的。第一个是备份与还原。Navicat 内置了备份功能可以针对单个数据库生成.nb3格式的备份文件也可以直接调用 SQL Server 自己的备份机制。我自己习惯用 Navicat 的计划功能定时跑备份任务虽然生产库的备份一般还是走 SQL Server Agent 更正规但测试环境这种轻量级备份用 Navicat 完全够用。第二个是数据同步和结构同步。测试环境和开发环境之间同步表结构、补数据用 Navicat 的结构同步和数据同步能省掉大量手工比对的时间。结构同步尤其好用勾选要同步的差异项一键生成脚本再预览确认执行。这种操作虽然不是生产环境迁移的替代品但在日常开发联调中极其高效。第三个是查询构造器和图表功能。对于不熟悉 SQL 语法的人来说查询构造器可以拖拽生成查询减少低级的语法错误对于熟悉 SQL 的人Navicat 的查询编辑器和执行计划可视化也能帮你快速找到慢查询的瓶颈。连接只是起点能把日常操作做顺才是工具的价值。5.3 SQL Server 与 MySQL 的习惯差异别用老经验踩新坑很多团队是 MySQL 为主偶尔要接 SQL Server 库。这种切换最容易出问题的地方不在连接本身而在 SQL 习惯。MySQL 用户刚到 SQL Server 上第一周基本都会踩这些坑分页不支持LIMIT而是用OFFSET ... FETCH或TOP表名虽然大小写不敏感但排序规则和忽略的尾随空格规则不同标识符用方括号[]而不是反引号字符串拼接用而不是CONCAT。Navicat 在这一点上做了好事它不需要你改变数据库本身只是你写 SQL 的时候要清楚目标是 SQL Server。比如在查询构造器里它生成的语法会根据连接类型自动切换但如果手动写语句还是得按 SQL Server 的语法来。我之前见过一个 MySQL 老手在 SQL Server 上写了半天的LIMIT 10查不出来还以为是连接配置有问题其实纯粹是方言差异。5.4 什么时候需要切回 SSMS虽然 Navicat 很顺手但有些场景下 SQL Server 官方工具还是不可替代的。比如你想查看 SQL Server 错误日志、管理 SQL Server Agent 作业、分析死锁图、查看更多底层的运行状态这些功能 SSMS 更完整。还有就是在排查连接问题时SSMS 作为官方客户端能提供更精确的错误上下文报错信息的细节比 Navicat 更完整。我个人的使用习惯是日常开发、调试、数据修复、结构对比用 Navicat需要做服务器级别的配置变更、查看系统视图和 DMV、管理代理作业时切回 SSMS。两者不是竞争关系而是互补关系。作为开发或运维你至少要让两种工具都能连上 SQL Server这样互相验证排查问题时才有对照基准。连接配置和维护这件事本质上就是一层一层把链路打通。Navicat 的便利性建立在正确的连接基础上连接一旦出错整条链路中间的每一层都可能是元凶。我这里最后再分享一个习惯每建一个连接就在备注里写清楚这个服务器是什么角色、哪个实例、固定端口是多少、归属于哪个团队。不要嫌麻烦等团队里出现跨人协作的时候这种备注能帮你少接无数个这个库怎么连的咨询电话。