Go_Gorm支持的数据类型
GORM 支持广泛的 Go 数据类型,并能自动将它们映射到对应的数据库类型。以下是 GORM 支持的主要数据类型及其在常见数据库(如 MySQL)中的映射关系:
基础数据类型
| Go 类型 | MySQL 类型 | 说明 |
|---|---|---|
bool |
TINYINT(1) |
布尔值,true=1, false=0 |
int |
INT |
32位整数 |
int8 |
TINYINT |
8位整数 |
int16 |
SMALLINT |
16位整数 |
int32 |
INT |
32位整数 |
int64 |
BIGINT |
64位整数 |
uint |
INT UNSIGNED |
无符号32位整数 |
uint8 |
TINYINT UNSIGNED |
无符号8位整数 |
uint16 |
SMALLINT UNSIGNED |
无符号16位整数 |
uint32 |
INT UNSIGNED |
无符号32位整数 |
uint64 |
BIGINT UNSIGNED |
无符号64位整数 |
float32 |
FLOAT |
单精度浮点数 |
float64 |
DOUBLE |
双精度浮点数 |
string |
VARCHAR(255) |
字符串(默认长度255),可通过标签指定长度 |
[]byte |
BLOB/LONGBLOB |
二进制数据 |
time.Time |
DATETIME/TIMESTAMP |
时间类型,默认精度到秒 |
高级/特殊类型
| Go 类型/用法 | MySQL 类型 | 说明 |
|---|---|---|
*int / sql.NullInt64 |
INT NULL |
可空整数 |
*bool / sql.NullBool |
TINYINT(1) NULL |
可空布尔值 |
*string / sql.NullString |
VARCHAR(255) NULL |
可空字符串 |
*float64 / sql.NullFloat64 |
DOUBLE NULL |
可空浮点数 |
*time.Time / sql.NullTime |
DATETIME NULL |
可空时间 |
gorm.DeletedAt |
DATETIME NULL |
软删除字段 |
json.RawMessage |
JSON (MySQL 5.7+) |
JSON 数据(需要数据库支持) |
map[string]interface{} |
JSON |
JSON 对象 |
[]string / []int |
JSON |
数组(序列化为 JSON) |
uuid.UUID (github.com/google/uuid) |
CHAR(36) |
UUID 类型 |
decimal.Decimal (github.com/shopspring/decimal) |
DECIMAL(65,30) |
高精度十进制数 |
自定义类型处理
GORM 支持通过接口实现自定义类型:
type MyCustomType string |
类型映射控制
可以通过 GORM 标签精确控制数据库类型:
type Product struct { |
枚举类型处理
虽然 Go 没有原生枚举,但可以通过字符串+检查实现:
type User struct { |
自动类型推断
当使用 AutoMigrate 时,GORM 会根据 Go 类型自动创建合适的数据库列:
db.AutoMigrate(&Product{}) |
特殊注意事项
时间类型:
time.Time默认映射为DATETIME- 使用
gorm:"type:TIMESTAMP"可指定为时间戳 - 使用
gorm:"autoCreateTime"/gorm:"autoUpdateTime"自动管理时间
JSON 支持:
- MySQL 5.7+ 原生支持 JSON 类型
- 旧版本可序列化为字符串存储
默认值:
Active bool `gorm:"default:true"`
大小限制:
Description string `gorm:"size:5000"` // TEXT 类型
自定义类型映射:
gorm:"type:MEDIUMTEXT" // 指定为 MEDIUMTEXT
数据库差异
| 类型 | MySQL | PostgreSQL | SQLite |
|---|---|---|---|
| 布尔值 | TINYINT(1) | BOOLEAN | BOOLEAN |
| 大文本 | LONGTEXT | TEXT | TEXT |
| 数组 | JSON | ARRAY | JSON |
| JSON | JSON (5.7+) | JSONB | JSON |
| 时间 | DATETIME | TIMESTAMP | DATETIME |
| 自增ID | AUTO_INCREMENT | SERIAL | AUTOINCREMENT |
建议在模型定义中显式指定类型以确保跨数据库兼容性。