
本文详解 go 语言连接 mysql 时出现 “sql: unknown driver 'mysql'” 错误的根本原因与完整解决方案,涵盖驱动导入规范、连接代码编写、错误处理及常见陷阱。
本文详解 go 语言连接 mysql 时出现 “sql: unknown driver 'mysql'” 错误的根本原因与完整解决方案,涵盖驱动导入规范、连接代码编写、错误处理及常见陷阱。
在 Go 中使用 database/sql 包操作数据库时,该包本身不包含任何数据库驱动实现——它仅提供统一的 SQL 接口抽象。因此,要连接 MySQL,必须显式引入兼容的第三方驱动(如官方推荐的 go-sql-driver/mysql),且需通过 空白标识符 _ 导入,以触发其内部的 init() 函数注册驱动。
✅ 正确做法:驱动导入 + 完整连接示例
首先确保已安装驱动:
go get -u github.com/go-sql-driver/mysql
然后编写完整可运行代码(含错误检查与资源释放):
package main
import (
"database/sql"
"fmt"
_ "github.com/go-sql-driver/mysql" // 关键:下划线导入,仅执行 init()
)
func main() {
// 构建 DSN(Data Source Name)
dsn := "astaxie:astaxie@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
db, err := sql.Open("mysql", dsn)
if err != nil {
panic(fmt.Sprintf("failed to open database: %v", err))
}
defer db.Close() // 记得关闭连接池(非单次连接)
// 验证连接是否可达(Ping 实际发起网络握手)
if err = db.Ping(); err != nil {
panic(fmt.Sprintf("failed to ping database: %v", err))
}
fmt.Println("✅ Successfully connected to MySQL!")
}
⚠️ 注意事项与常见误区
- import _ "github.com/go-sql-driver/mysql" 不可省略:若未导入或误写为 import "github.com/go-sql-driver/mysql"(无 _),编译器会报 imported and not used,因为该包未被直接调用;而加 _ 后,Go 会自动执行其 init() 函数,将 "mysql" 驱动注册到 database/sql 的驱动管理器中。
-
DSN 格式建议升级:旧式 user:pass@/db 缺少主机和端口,默认可能连错(如 Unix socket)。推荐显式使用 user:pass@tcp(127.0.0.1:3306)/dbname,并添加关键参数:
- parseTime=True:支持 time.Time 类型解析;
- loc=Local:避免时区转换异常;
- charset=utf8mb4:完整支持 Unicode(含 emoji)。
- sql.Open() 不等于连接建立:它仅初始化连接池,不校验数据库可达性。务必调用 db.Ping() 或执行查询来确认真实连通性。
- defer db.Close() 是最佳实践:虽 sql.DB 是连接池,但显式关闭可及时释放底层资源,尤其在短生命周期程序中至关重要。
? 补充说明
Go 生态中所有 SQL 驱动均遵循相同模式:通过 _ 导入触发注册。除 MySQL 外,PostgreSQL(lib/pq)、SQLite(mattn/go-sqlite3)等也需类似处理。官方维护的驱动列表见 SQLDrivers Wiki。
掌握这一机制,不仅能解决 MySQL 连接问题,更能为后续接入任意关系型数据库打下坚实基础。











