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

如何解决`invalid packet size, it is shorter than header size`数据库连接错误?

解决Go连接SQL Server时出现"invalid packet size, it is shorter than header size"错误

问题描述

连接SQL Server数据库时触发以下错误:

2022/11/10 13:30:43 invalid packet size, it is shorter than header size

错误发生在db.PingContext(ctx)调用时,对应的Go代码如下:

var server = "123.45.67.89"
var port = 3030
var user = "myUserId"
var password = "MyPassword"
var database = "myDB"

func main() {
    // Build connection string
    connString := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;",
        server, user, password, port, database)

    var err error

    // Create connection pool
    db, err = sql.Open("sqlserver", connString)
    if err != nil {
        log.Fatal("Error creating connection pool: ", err.Error())
    }

    ctx := context.Background()
    err = db.PingContext(ctx)
    if err != nil {
        fmt.Println("Catching ERR")
        log.Fatal(err.Error())
    }
    fmt.Printf("Connected!\n")
}

解决方法

1. 确认端口与SQL Server服务匹配

这个错误核心原因是驱动接收到的数据包不符合SQL Server协议规范,大概率是连接的端口并非SQL Server监听的端口。SQL Server默认端口为1433,你使用的3030可能属于其他服务。可以通过以下方式验证:

  • 登录目标服务器,在SQL Server配置管理器中查看TCP/IP协议的监听端口
  • 检查服务器防火墙规则,确认开放的SQL Server端口

2. 修改连接字符串格式

使用go-mssqldb驱动时,推荐在连接字符串中明确指定TCP连接方式,格式调整为:

connString := fmt.Sprintf("tcp:%s,%d;user id=%s;password=%s;database=%s;",
    server, port, user, password, database)

这种格式能避免驱动对服务器地址和端口的解析歧义。

3. 排查网络连通性

先验证本地到目标服务器端口的网络是否通畅,使用telnet或nc命令测试:

telnet 123.45.67.89 3030
# 或者用nc命令
nc -zv 123.45.67.89 3030

如果连接失败,说明存在防火墙拦截、端口未开放或网络链路故障,需要先解决网络问题。

4. 更新驱动版本

旧版本的go-mssqldb驱动可能存在协议解析bug,执行以下命令更新到最新版本:

go get -u github.com/denisenkom/go-mssqldb

内容的提问来源于stack exchange,提问作者Ashutosh Yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:40:34