Mysql的日期和时间类型
记录:在本周工作中,有一个需求要将某个字段的默认带值给去除,在去除之后运行时又出现了insert错误的情况,开始以为原因是该数据库字段为DATETIME类型,必须要有默认值,没有默认值时就会出现插入错误的情况,后改为timestamp类型解决。但是后来整理博客和测试之后发现DATETIME类型没有默认值也是可以插入的,后来在某篇博客上看见还可能与mysql的版本有关,应该就是这个问题,因为我们开发环境是5点几的版本出现了该问题,而我本地8点几版本的未出现问题(待确认)。
mysql与java的对应关系
MySQL Type Name | Return value of GetColumnClassName | Returned as Java Class |
---|---|---|
DATETIME | DATETIME | java.sql.Timestamp |
DATE | DATE | java.sql.Date |
TIMESTAMP[(M)] | TIMESTAMP | java.sql.Timestamp |
TIME | TIME | java.sql.Time |
这些数据类型的主要区别如下:
1.如果要用来表示年月日,通常用DATE 来表示。
2.如果要用来表示年月日时分秒,通常用DATETIME 表示。
3.如果只用来表示时分秒,通常用TIME 来表示。
4.如果需要经常插入或者更新日期为当前系统时间,则通常使用TIMESTAMP 来表示。TIMESTAMP 值返回后显示为“YYYY-MM-DD HH:MM:SS”格式的字符串,显示宽度固定为19 个字符。如果想要获得数字值,应在TIMESTAMP 列添加+0。
5.如果只是表示年份,可以用YEAR 来表示,它比DATE 占用更少的空间。YEAR 有2 位或4 位格式的年。默认是4 位格式。在4 位格式中,允许的值是1901~2155 和0000。在2 位格式中,允许的值是70~69,表示从1970~2069 年。MySQL 以YYYY 格式显示YEAR值。
测试一下:
都未设置默认值的情况下:
insert into course(Cno, Cname, Ctimestamp, Cdatetime, Cdate, Ctime, Cyear)
values ('111', '小明',now(),now(),now(),now(),now());
结果:成功插入
可以明显看出各字段的不同,主要就是DATETIME和TIMESTAMP不好区分。
TIMESTAMP的特点:
1.MySQL只给表中的第一个TIMESTAMP字段设置默认值为系统日期,如果有第二个TIMESTAMP类型,则默认值设置为0值,可以修改第二个TIMESTAMP类型的默认值为其他常量日期,但是不能再修改为current_timestmap,因为MySQL规定TIMESTAMP类型字段只能有一列的默认值为current_timestmap,如果强制修改,系统会报错。
2.TIMESTAMP还有一个重要特点,就是和时区相关。当插入日期时,会先转换为本地时区后存放;而从数据库里面取出时,也同样需要将日期转换为本地时区后显示。而DATETIME类型存储的int,与时区没有关系。
3.TIMESTAMP的范围比之DATETIME要小。
DATETIME类型要这样设置默认值:
参考博客
https://blog.csdn.net/weixin_34177064/article/details/86120034