问题记录
在用go语言写项目操作数据库时,由于我的User结构体中存在时间字段
type User struct {
ID uint `gorm:"primary_key"`
CreatedAt time.Time `gorm:"type:timestamp;not null"`
UpdatedAt time.Time `gorm:"type:timestamp;not null"`
UserName string `gorm:"type:varchar(20);not null" json:"username"`
PassWord string `gorm:"type:varchar(20);not null" json:"password"`
Role int `gorm:"type:int" json:"role"`
}
然后在更新数据库时报了错
err := db.Create(&data).Error
Error 1292: Incorrect datetime value: '2022-07-20 15:52:42.7744207' for column 'created_at' at row 1
从报错上来看大概是值的类型与值不对应造成的不合法
于是我将值类型改为 datatime 和 timestamp
都不行,于是去查资料
解决方法
这个链接解决了我的问题,但该链接的主人解决的是时间不能为0,我一开始也有碰到,后面不懂解决遂放弃那个本来在我项目里的 del_at字段。
造成问题的主要原因是mysql的严格模式造成的。
解决方法
查看sql_mode
# 查看当前sql_mode
select @@sql_mode;
# 查看全局sql_mode
select @@global.sql_mode;
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select @@global.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql>
修改sql_mode
暂时性修改
也不用像下面那样写,只要你把你的sql_mode中的 STRICT_TRANS_TABLES 字段去掉就ok了
# 修改全局
set @@global.sql_mode = 'ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
# 修改当前
set @@sql_mode = 'ONLY_FULL_GROUP_BY,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
永久性修改
上面的只是暂时性修改,当你的电脑重启后,MySQL服务也随之重启,这时MySQL服务端会去读取my.ini
配置文件,来覆盖你直接的设置,所以若想有永久修改,便需要直接去修改my.ini
文件(MySQL的配置文件)
-
找到
my.ini
文件
-
右键以记事本打开
-
直接ctrl+f 搜索 STRICT_TRANS_TABLES,然后删除该字段便ok了