Navicat 17 中 SQL Server 连接需协同配置 Connection Timeout(建连超时,默认30秒,建议45–60秒)、Socket Timeout(执行/导入超时,默认30秒,应设为预期耗时的1.5倍)和 Query Timeout(单语句超时,建议略短于 Socket Timeout),三者独立生效且须与服务端 remote query timeout 等参数匹配;network packet size 不可在 Navicat 配置,须由 SQL Server 服务端通过 sp_configure 设置。

Navicat 17 不提供统一的“超时阈值”开关,SQL Server 连接涉及三个互不干扰、但必须协同设置的超时参数:Connection Timeout、Socket Timeout 和服务端 remote query timeout。只调其中一个,大概率白忙。
Connection Timeout 控制建连阶段,不是你遇到“卡在导出中”的原因
它只管从点击“连接”到完成 TCP 握手 + SQL Server 身份认证的总耗时,默认 30 秒。即使你把它拉到 120 秒,执行一条慢查询仍会中断——那是 Socket Timeout 在起作用。
- 适用场景:首次连接失败、SSL 协商慢、中间有代理或强制加密时
- 建议值:45~60 秒(云数据库或启用了加密的实例建议设高些)
- 位置:编辑连接 → 「常规」页签 →
Connection Timeout输入框 - 注意:
Connection Timeout不影响任何已建立连接后的 SQL 执行,别指望靠它解决“查询超时”或“导入中断”
Socket Timeout 才是你导出/导入/执行大查询时真正要改的参数
它控制 Navicat 等待 SQL Server 返回结果的最长时间,单位秒,默认仅 30 秒。百万行导出脚本跑 90 秒就会静默断开,界面卡死或报“连接已关闭”,就是它没调。
- 适用场景:运行长耗时 SELECT、导入大 SQL 文件、执行 BULK INSERT
- 建议值:填入预期最长执行时间的 1.5 倍(如预估 120 秒,填
180;单位必须是纯数字,180s会失效) - 位置:编辑连接 → 「高级」页签 →
Socket Timeout(sec) - 注意:PostgreSQL 用户需同步检查服务端
statement_timeout,它优先级更高;SQL Server 用户要注意 ODBC 驱动自带隐式Connect Timeout=30,Navicat 不暴露该字段,升级驱动或换 JDBC 模式可绕过
Query Timeout 是另一个独立开关,专为单条语句设限
它和 Socket Timeout 并存,但作用对象不同:Socket Timeout 是底层 socket 层读取等待,而 Query Timeout 映射为 ODBC 的 SQL_ATTR_QUERY_TIMEOUT,更贴近语句生命周期管理。
- 适用场景:防止某条失控查询长期占用连接,尤其在共享连接池或定时任务中
- 建议值:与
Socket Timeout接近,但略短(如Socket Timeout设 180,则Query Timeout可设 150) - 位置:编辑连接 → 「高级」页签 →
Query Timeout(不是Socket Timeout,也不是KeepaliveInterval) - 注意:若服务端
remote query timeout(可通过sp_configure 'remote query timeout'查)设得更小(默认 600),则以服务端为准
network packet size 根本不能也不该在 Navicat 里配
Navicat 没有配置入口,因为 network packet size 是 SQL Server 实例级参数,默认 4096 字节。客户端最多通过连接字符串加 Packet Size=8192 “请求”,但最终是否采纳由服务端决定。
- 什么时候才需要调?只有表含大量
varchar(max)、varbinary(max)或高频 BULK INSERT 时才考虑 - 风险点:加密连接下最大仅支持 16383;启用 MARS 后实际可用再减 16 字节;旧版驱动(如 SQL Server Native Client)可能静默降级或报
Native Error: 233 - 正确做法:在 SQL Server 中执行
sp_configure 'network packet size', 8192; RECONFIGURE;,而非折腾 Navicat
最容易被忽略的是:这三个超时参数之间没有自动对齐机制,Socket Timeout 设再大,若服务端 remote query timeout 或 statement_timeout 更小,照样中断;反过来,只调服务端却忽略 Navicat 的 Socket Timeout,客户端层先扛不住。务必两端一起看,且优先确认服务端真实值。











