go gorm mysql报错:Error 1292: Incorrect datetime value: ‘XXX‘ for column ‘created_at‘ at row 1

问题记录

在用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的配置文件)

  1. 找到my.ini文件
    go gorm mysql报错:Error 1292: Incorrect datetime value: ‘XXX‘ for column ‘created_at‘ at row 1_第1张图片

  2. 右键以记事本打开
    go gorm mysql报错:Error 1292: Incorrect datetime value: ‘XXX‘ for column ‘created_at‘ at row 1_第2张图片

  3. 直接ctrl+f 搜索 STRICT_TRANS_TABLES,然后删除该字段便ok了

你可能感兴趣的:(mysql,golang,数据库)