开发者社区> 漫天花雨> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

timestamp类型在not null时可以插入null值?

简介: 背景 有同学问在RDS MySQL 5.6在timestamp 设置为 not null 并且SQL模式是严格模式时,仍然可以插入空值,理论上应该有报错,是不是RDS的bug? 环境 MySQL 5.
+关注继续查看

背景

有同学问在RDS MySQL 5.6在timestamp 设置为 not null 并且SQL模式是严格模式时,仍然可以插入空值,理论上应该有报错,是不是RDS的bug?

环境

MySQL 5.6 5.7 8.0,在RDS和自建数据库上都会遇到

现象

image
从上图中可以看到,在timestamp设置为not null时会自动补齐:

DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

在客户的自建环境中timestamp类型没有自动补齐,在严格模式下会报错;
在RDS MySQL的环境中datetime类型没有自动补齐,,在严格模式下会报错:
image

溯源

If the explicit_defaults_for_timestamp system variable is disabled, TIMESTAMP columns by default are NOT NULL, cannot contain NULL values, and assigning NULL assigns the current timestamp. To permit a TIMESTAMP column to contain NULL, explicitly declare it with the NULL attribute. In this case, the default value also becomes NULL unless overridden with a DEFAULT clause that specifies a different default value. DEFAULT NULL can be used to explicitly specify NULL as the default value. (For a TIMESTAMP column not declared with the NULL attribute, DEFAULT NULL is invalid.) If a TIMESTAMP column permits NULL values, assigning NULL sets it to NULL, not to the current timestamp.
在explicit_defaults_for_timestamp值为OFF时,会自动补齐上文中的内容,而客户的环境里面explicit_defaults_for_timestamp是ON的,所以跟RDS MySQL结果有差异,跟客户说过后,验证就是explicit_defaults_for_timestamp值差异导致。

结论

每一件不合理的事情背后,必然有一个自己还未了解的合理原因.

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MySQL将timestamp默认值设置为null
以前MySQL创建表的的时候,timestamp类型的字段可以不加默认值。
44 0
React Native 'config.h' file not found
image.png 解决办法 cd node_modules/react-native/third-party/glog-0.3.4 ../.
1327 0
java创建Timestamp的几种方式
Timestamp time1 = new Timestamp(System.currentTimeMillis()); Timestamp time2 = new Timestamp(new Date().
2851 0
mysql单表多timestamp的current_timestamp设置问题
一个表中出现多个timestamp并设置其中一个为current_timestamp的时候经常会遇到 1293 - Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP i...
1038 0
MySQL 时间戳(Timestamp)函数
1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp() mysql> select current_timestamp, current_timestamp(); +---------------------+--------------...
803 0
C# 读取 timestamp 时间戳 值为byte[] 类型时转换为时间戳字符串
C# 中如何读取出来的时间戳为 byte[] 类型的话,用以下方式转换成 16进制字符串 string tmpUfts = "0x"+ BitConverter.ToString(dataRow["MaxRowVersion"] as System.
1217 0
TCP Timestamp选项
TCP Timestamp选项 Description Protocol suite: TCP/IP. Protocol type: Transport layer protocol.
853 0
令人困惑的oracle.sql.TIMESTAMP
程序在Weblogic10.3.0下运行正常,在Weblogic10.3.5下写好的程序无法通过,跟踪代码后发现ResultSet对象通过方法ResultSet.getObject(int)返回的对象为oracle.sql.TIMESTAMP,而不是java.sql.Timestamp。所以造成后续代码解析值时运行异常。   跟踪代码后发现,两个Weblogic使用的连接池使用的JDBC名称一
827 0
+关注
漫天花雨
支持阿里云数据库,希望能为更多云用户服务;之前支持阿里巴巴集团数据库,承担了业务的数据库设计,架构优化,异地多活,库存热点优化,稳定性保障等工作,经历数次双11,有丰富的实战和优化经验和对业务的敏感度。关注数据库、数据仓库、大数据等领域。
文章
问答
来源圈子
更多
让用户数据永远在线,让数据无缝的自由流动
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载