关于mysql字段时间类型timestamp默认值为当前时间问题

今天把应用部署到AWS上发现后台修改内容提交后程序报错,经过排查发现是更新数据的时候,有张数据表中的一个timestamp类型的字段默认值变成了"0000-00-00 00:00:00.000000"格式,导致解析失败造成的。

在mysql该字段的创建语句如下

`XXX` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  正常情况下 应该是当前数据更改的时间格式

因为在本地开发环境测试过,没有该问题,应用环境一直,唯一不同的是,生产环境数据库用的是AWS的RDS的mysql,经过对错误信息的搜索,大致应该是mysql参数配置的问题。

 

看了下mysql官方文档

By default, the first TIMESTAMP column has both DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP if neither is specified explicitly。

很多时候,这并不是我们想要的,如何禁用呢?

1. 将“explicit_defaults_for_timestamp”的值设置为ON。

2. “explicit_defaults_for_timestamp”的值依旧是OFF,也有两种方法可以禁用

     1> 用DEFAULT子句该该列指定一个默认值

     2> 为该列指定NULL属性。

mysql> show variables like '%explicit_defaults_for_timestamp%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF   |
+---------------------------------+-------+
row in set (0.00 sec)

开发环境explicit_defaults_for_timestamp 的值是OFF


比对了下RDS中mysql的参数,发现这个参数值为0,因为rds中mysql的默认参数组是不允许修改的,所以创建个参数组,会默认把default的参数组继承过来,当时并不知道这里的0和1是怎么对应on和off的,所以就把值改成了1.然后重启rds。

此时发现就不会有该错误了。

将rds中mysql的参数改成如下情况 完美解决

explicit_defaults_for_timestamp = 1

 

时间: 2024-08-25 18:28:15

关于mysql字段时间类型timestamp默认值为当前时间问题的相关文章

MYSQL中设列的默认值为Now()

MySQL目前不支持列的Default为函数的形式,如达到你某列的默认值为当前更新日期与时间的功能,你可以使用TIMESTAMP列类型 下面就详细说明TIMESTAMP列类型 TIMESTAMP列类型 TIMESTAMP值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示. TIMESTAMP值显示尺寸的格式如下表所示: : +---------------+----------------+ | 列类型 | 显示格式 | | TIMESTAMP(14) | YYYYMMD

MySQL表结构使用timestamp以自动获取当前时间

一.怀念ACCESS的时代 ACCESS的表结构如果想自动插入当前时间的时候,可以在列定义的时候输入默认值now ()就可以实现 自动插入当前时间了.而MySQL则行不通,MySQL这个东东默认是命令行下面的产物,如果不是后来有了 phpMyAdmin这个图形化界面东东的话,估计一般人都郁闷了.当然,后来MySQL官方也出了对应的gui工具 ,当然是exe的了.受到MySQL这个网络服务程序的好多使用者都是租用虚拟主机的前提下,貌似这种东东 又是个奢侈品.hoho,又跑题了,今天的话题是使用在M

MySQL设置当前时间为默认值方法

代替的方案是使用TIMESTAMP类型代替DATETIME类型. CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段不会改变. CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP :当我更新这条记录的时候,这条记录的这个字段将会改变.即时间变为了更新时候的时间. (注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改.)如果有多个TI

MySQL修改字段默认值

环境 MySQL 5.1 + 命令行工具 问题 MySQL修改字段默认值 解决 alter table topic alter column cateId set default '2'; 语法总结 alter table表名alter column字段名drop default; (若本身存在默认值,则先删除) alter table表名 alter column 字段名 set default默认值;(若本身不存在则可以直接设定) 查看本栏目更多精彩内容:http://www.biancen

【MySQL】时间类型存储格式选择

一  前言  昨天在给开发同学做数据库设计规范分享的时候,讲到时间字段常用的有三个选择datetime.timestamp.int,应该使用什么类型的合适?本文通过三种类型的各个维度来分析,声明:本文没有具体的结论,但是会给一个推荐使用方式,需要使用者结合自己的业务场景来具体选择. 二 分析int型:存储长度: 4字节表示范围: date('Y-m-d H:i:s', 4294967295) 最大到 2106-02-07 14:28:15 ,如果一个企业活过这么久,就需要数据库考虑 bigint

MySQL表字段设置默认值

环境 MySQL 5.1 + 命令行工具 问题 MySQL表字段设置默认值 解决 --SQL: CREATE TABLE test( i_a int NOT NULL DEFAULT 1, ts_b timestamp NOT NULL DEFAULT NOW(), c_c char(2) NOT NULL DEFAULT '1' ); --以下SQL不合法 --time_d time NOT NULL DEFAULT CURTIME(), --date_e date NOT NULL DEFA

MySQL表字段设置默认值(图文教程及注意细节)_Mysql

环境 MySQL 5.1 + 命令行工具 问题 MySQL表字段设置默认值 解决 复制代码 代码如下: --SQL: CREATE TABLE test( i_a int NOT NULL DEFAULT 1, ts_b timestamp NOT NULL DEFAULT NOW(), c_c char(2) NOT NULL DEFAULT '1' ); --以下SQL不合法 --time_d time NOT NULL DEFAULT CURTIME(), --date_e date NO

hibernate-数据库表增加字段后如何在获取历史数据时添加默认值?

问题描述 数据库表增加字段后如何在获取历史数据时添加默认值? 表增加了一个字段,定义是基本类型有默认值,新生成的数据没问题但是历史数据该字段都是空值,导致程序会出错,JavaBean中的字段类型double和数据库中的空值不匹配,本来想在get和set中做点文章,返回一个默认值,但是用hibernate的detachedCriteria查询返回的list直接就报null的错误,set方法都没执行,不知道是什么原理为什么set方法都没执行,是不是在set传入变量的时候就发现空值然后就报错了?另外有

设计数据库必读 mysql 字段大全 大小 范围 用途 区别

MYSQL的所有字段使用大全,必读,身藏 1.mysql的数值类型 列类型                       需要的存储量 TINYINT                         1 字节  SMALLINT                      2 个字节  MEDIUMINT                   3 个字节  INT                                 4 个字节  INTEGER