如何解决`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
相关产品推荐
相关产品推荐

