开发时碰到了mysql中字段类型为enum中,比如下面的gender字段
CREATE TABLE `user` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`account` varchar(255) NOT NULL COMMENT '登录账号',
`gender` enum('no','male','female') NOT NULL DEFAULT 'no' COMMENT '性别',
PRIMARY KEY (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 COMMENT='用户表'
对应字段类型看似是string类型的,因此定义结构体定义为了
type User struct {
Id int
Account string
Gender string
}
但是在用gorm库create表记录是有如下错误:
newUser := &db.User{
Account: "Test",
}
if err := sqlDB.Create(newUser).Error; err != nil {
return err
}
// err为 Error 1265: Data Truncated
猜想到的问题原因是
Data Truncated通常是因为字段类型不匹配导致的,这里因为设定gender为空,和mysql定义的默认值为no
产生了冲突,gorm默认按照string的默认值去insert记录也就出问题了,这里其实需要告诉gorm该字段类型的定义的,因此添加上mysql的标记,让gorm默认值和mysql定义的一致
type User struct {
Id int
Account string
Gender string `gorm:"type:enum('no','male','female');default:no"`
}
之后在插入(create)记录就没问题了。