gorm 连接 mariadb 与 mysql 完全一致,直接使用 gorm.io/driver/mysql 驱动即可;因其底层依赖 go-sql-driver/mysql,而该驱动原生支持 mariadb(10.2+ 起全面兼容 mysql 协议),仅需确保 dsn 正确、权限开放、网络可达,且推荐显式配置 charset=utf8mb4、parsetime=true、loc=local,并避免使用 charset=utf8 或域名 host(若启用 skip-name-resolve)。

GORM 连接 MariaDB 和连接 MySQL 完全一致,**直接用 gorm.io/driver/mysql 驱动即可,无需额外适配或更换驱动包**。MariaDB 是 MySQL 的兼容分支,GORM 的 MySQL 驱动底层依赖 github.com/go-sql-driver/mysql,该驱动原生支持 MariaDB(从 10.2 起全面兼容 MySQL 协议),只要 DSN 正确、权限开放、网络可达,就能正常工作。
为什么 mysql 驱动能连 MariaDB?
因为 MariaDB 服务端实现的是标准 MySQL wire protocol,go-sql-driver/mysql 并不校验后端是 MySQL 还是 MariaDB,只按协议通信。实际项目中(如 Sliver、TiDB 生态工具)大量使用该组合,稳定性已验证多年。
- MariaDB 10.2+ 默认启用
mysql_native_password认证插件,与 MySQL 5.7+ 一致,无需额外配置 auth plugin - GORM 的迁移语句(如
AutoMigrate)、时间解析(parseTime=True)、字符集(charset=utf8mb4)等行为在 MariaDB 上完全可用 - 若遇到
ERROR 1236 (HY000): Could not find first log file name in binary log index file类报错,那是复制配置问题,和 GORM 无关
DSN 写法和 MySQL 完全一样,但要注意这些细节
虽然语法相同,但 MariaDB 默认配置可能和 MySQL 有差异,容易导致连接失败或行为异常:
-
charset=utf8mb4必须显式指定——MariaDB 10.4+ 默认collation_server是utf8mb4_general_ci,但旧版本可能 fallback 到latin1,不加会触发乱码或插入失败 -
parseTime=True和loc=Local仍需保留——MariaDB 的TIMESTAMP行为和 MySQL 一致,依赖 Go 的time.Time解析 - 避免用
charset=utf8——MariaDB 中它实际映射到utf8mb3,不支持 emoji,应统一用utf8mb4 - 如果 MariaDB 启用了
skip-name-resolve,DSN 中的 host 不能写域名,必须用 IP(如127.0.0.1而非localhost),否则连接超时
兼容老版本 MariaDB(
MySQL 8 / MariaDB 10.5+ 支持的语法,在老版 MariaDB 上会报错,比如 ALTER TABLE ... RENAME COLUMN 或高精度 datetime。此时需显式禁用:
- 设置
DisableDatetimePrecision: true:MariaDB 10.2 不支持DATETIME(6),否则AutoMigrate会失败 - 设置
DontSupportRenameColumn: true:MariaDB 10.2 不支持RENAME COLUMN语法,GORM 会改用CHANGE COLUMN - 设置
DontSupportRenameIndex: true:MariaDB 10.1 不支持RENAME INDEX,GORM 会走删 + 建流程 - 不要设
SkipInitializeWithVersion: true——它会跳过版本探测,导致上述兼容开关失效;保持默认false让 GORM 自动识别 MariaDB 版本并调整行为
连接池和超时参数和 MySQL 无区别,但建议显式配置
MariaDB 默认 wait_timeout=28800(8 小时),但连接空闲太久可能被服务端主动断开,GORM 不会自动重连,需靠连接池回收机制兜底:
- 调用
db.DB().SetConnMaxLifetime(30 * time.Minute):强制 30 分钟内重连,避免invalid connection - 调用
db.DB().SetMaxIdleConns(10)和db.DB().SetMaxOpenConns(50):防止 MariaDB 达到max_connections限制 - DSN 中加
timeout=5s&readTimeout=10s&writeTimeout=10s:避免单个查询卡死整个连接池
真正容易被忽略的是:MariaDB 的 max_allowed_packet 默认仅 4MB,如果用 GORM 批量插入大 JSON 字段或 blob,会静默截断或报 ERROR 2006 (HY000): MySQL server has gone away——这不是连接问题,得去 MariaDB 配置里调大这个值。











