MySQL字符类型datetime与timestamp
这片博客来详细分区一下这哥俩!
首先来说明这两个字符类型:
DATETIME | 8 | 1000-01-01 00:00:00 ~9999~12-31 23:59:59 | 0000-00-00 00:00:00 |
TIMESTAMP(包含时区信息) | 4 | 1970-01-01 08:00:01~2038-01-19 11:14:07 | 0000-00-00 00:00:00 |
如上直观的看到timestamp类型占用了更少的字节,但是timestamp表示的时间却是有限的。
这两个值都可以自动初始化并且更新为当前的时间戳,对于表中的任何TIMESTAMP或 DATETIME列,您可以将当前时间戳分配为默认值,自动更新值或两者:
首先说这两个类型都可以做的事: 这两个类型都可以设置默认值,也都可以设置自动更新。下面举例说明。
create table tb5(
t1 datetime default current_timestamp on update current_timestamp, #设置为当前时间戳为默认值,并且自动更新
t2 datetime default current_timestamp, #仅设置当前时间戳为默认值
t3 timestamp default current_timestamp on update current_timestamp,
t4 timestamp default current_timestamp,
t5 varchar(10),
t6 int auto_increment not null primary key)
当向表中插入一条数据时,t1~t4会插入当前时间戳的默认值!
mysql> insert into tb5(t5) select NULL;
Query OK, 1 row affected (0.05 sec)
Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from tb5; #t1~t4因为是以当前时间戳为默认值的,因此相等。
+---------------------+---------------------+---------------------+---------------------+------+----+
| t1 | t2 | t3 | t4 | t5 | t6 |
+---------------------+---------------------+---------------------+---------------------+------+----+
| 2019-01-09 13:58:10 | 2019-01-09 13:58:10 | 2019-01-09 13:58:10 | 2019-01-09 13:58:10 | NULL | 1 |
+---------------------+---------------------+---------------------+---------------------+------+----+
1 row in set (0.00 sec) mysql>
下面我们修改插入的这一行数值,就可以发现不同了!
mysql> update tb5 set t5="a" where t6=1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from tb5; #看到了什么不一样的地方。t1和t3的值会自动修改,而t2和t4的值不会的。
+---------------------+---------------------+---------------------+---------------------+------+----+
| t1 | t2 | t3 | t4 | t5 | t6 |
+---------------------+---------------------+---------------------+---------------------+------+----+
| 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | a | 1 |
+---------------------+---------------------+---------------------+---------------------+------+----+
1 row in set (0.00 sec)
default current_timestamp: 只是会设置字段值为当前时间戳,不会随着记录中其他字段的更新而更新。
on update current_timestamp: 则是表示字段值,会随着记录中其他字段值更新而更新为当前时间戳。
官方文档上说timestamp默认数值为0,datetime默认值为null,但是下面语句却执行失败!
create table tb6(
t1 datetime on update current_timestamp,
t2 datetime not null on update current_timestamp,
t3 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
t4 timestamp null on update current_timestamp,
t5 varchar(10),
t6 int auto_increment not null primary key
) #错误提示就是Error Code: 1067. Invalid default value for 't3'
上面的t1和t3只要有对应记录中字段数值的改变那么t1和t3的值就会更新。如果想不让他们自动自动更新,除了修改其默认属性(也就是不添加on update current_timestamp)外,MySQL还有一个变量控制这个行为:explicit_defaults_for_timestamp,其默认值为
mysql> show variables like "%explicit%";
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF |
+---------------------------------+-------+
1 row in set (0.00 sec) #默认数值为off,把其设置为on即可!
测试一下:
mysql> set global explicit_defaults_for_timestamp="ON"; #设置这个参数值为ON
Query OK, 0 rows affected (0.00 sec) mysql> set session explicit_defaults_for_timestamp="ON";
Query OK, 0 rows affected (0.00 sec) mysql> show variables like "%explicit%";
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON |
+---------------------------------+-------+
1 row in set (0.01 sec) mysql> insert into tb5(t5) select NULL; #插入数据,
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0 mysql> select * from tb5; #查看其第二行的数据
+---------------------+---------------------+---------------------+---------------------+------+----+
| t1 | t2 | t3 | t4 | t5 | t6 |
+---------------------+---------------------+---------------------+---------------------+------+----+
| 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | a | 1 |
| 2019-01-09 14:44:08 | 2019-01-09 14:44:08 | 2019-01-09 14:44:08 | 2019-01-09 14:44:08 | NULL | 2 |
+---------------------+---------------------+---------------------+---------------------+------+----+
2 rows in set (0.00 sec) mysql> update tb5 set t5="b" where t6=2; #更改第二行的字段值
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from tb5; #可以看到t1和t3的值还是自动更新了
+---------------------+---------------------+---------------------+---------------------+------+----+
| t1 | t2 | t3 | t4 | t5 | t6 |
+---------------------+---------------------+---------------------+---------------------+------+----+
| 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | 2019-01-09 14:00:49 | 2019-01-09 13:58:10 | a | 1 |
| 2019-01-09 14:44:41 | 2019-01-09 14:44:08 | 2019-01-09 14:44:41 | 2019-01-09 14:44:08 | b | 2 |
+---------------------+---------------------+---------------------+---------------------+------+----+
2 rows in set (0.00 sec)
原因是什么?explicit_defaults_for_timestamp的数值会影响表结构,当表结构已经创建,那么再设置这个数值是不会起作用的。并且在定义的时候不需要显示指定on update current_timestamp参数。
可以参考这片博客:https://www.cnblogs.com/JiangLe/p/6956865.html
二者的不同
上面提到的都是这两个类型都可以做的事,下面来说明二者的不同之处。
1:上面已经提到的二者占用的大小不同,datetime占用8个字节,而timestamp占用4个字节。
2:还有就是表示的时间范围不同。
3:timestamp的时间显示值依赖于时区;如果在多个时区存储或访问数据,timestamp和datetime的行为将很不一样。timestamp提供的数值和时区有关系,而datetime则是文本表示的日期和时间。
除了特殊的行为,通常也应该尽量使用TIMESTAMP。
如果要存储比秒更小粒度的日期和时间怎么办?MySQL目前没有提供合适的数据类型,但是可以使用自己的存储格式;可以使用BIGINT类型存储微妙级别的问题,或者使用DOUBLE存储秒之后的小数部分。也可以使用mariadb或者percona server。
MySQL字符类型datetime与timestamp的更多相关文章
- mysql 时间类型datetime与timestamp区别比较
mysql 时间类型datetime与timestamp区别比较 相同点: 显示宽度和格式相同,显示宽度固定在19字符,格式为YYYY-MM-DD HH:MM:SS. 不同点: (1)时间范围不同: ...
- 【blog】mysql字段类型datetime和timestamp的区别
首先 DATETIM和TIMESTAMP类型所占的存储空间不同,前者8个字节,后者4个字节,这样造成的后果是两者能表示的时间范围不同.前者范围为1000-01-01 00:00:00 ~ 9999-1 ...
- MySQL中的datetime与timestamp比较-------转载
原文地址http://database.51cto.com/art/200905/124240.htm MySQL中的datetime与timestamp比较 本文将通过实例比较MySQL中的date ...
- MySQL5日期类型DATETIME和TIMESTAMP相关问题详解
MySQL5日期类型DATETIME和TIMESTAMP相关问题详解 MySQL5的日期类型有三种:DATETIME.DATE和TIMESTAMP,除了DATE用来表示一个不带时分秒的是日期,另外两个 ...
- mysql字符类型大小写敏感的讨论
mysql字符类型默认是不区分大小写的,即select * from t where name='AAA'与='aaa'没区别,以下是测试的例子 (root)); (root,,,,'BbB'); ( ...
- MySql中的时间类型datetime,timestamp,date,year比较
MySQL日期类型.日期格式.存储空间.日期范围比较.日期类型 存储空间 日期格式 日期范围------------ --------- ...
- mysql中 date datetime time timestamp 的区别
MySQL中关于时间的数据类型:它们分别是 date.datetime.time.timestamp.year date :"yyyy-mm-dd" 日期 1000-01 ...
- mysql string types ---- mysql 字符类型详解
一.mysql 中包涵的字符类型: [national] char [(m)] [character set charset_name] [collate collation_name] [natio ...
- mysql字符类型
字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定 ...
随机推荐
- Spark MLlib之水塘抽样算法(Reservoir Sampling)
1.理解 问题定义可以简化如下:在不知道文件总行数的情况下,如何从文件中随机的抽取一行? 首先想到的是我们做过类似的题目吗?当然,在知道文件行数的情况下,我们可以很容易的用C运行库的rand函数随机的 ...
- 282A
#include <iostream> #include <string> using namespace std; int main() { int n, plus, sub ...
- fasttext与Linear SVC 分类测试结果
任务:分类出优质问题与非优质问题.任务背景:用户实际与智能客服交互的时候,如果只做阈值限制,在相似问题匹配的时候(由于词的重复),依然会匹配出部分结果.如:问题为 "设置好了?", ...
- python 调用阿里云服务器api创建服务器
首先安装阿里云SDK pip install aliyun-python-sdk-core pip install aliyun-python-sdk-ecs 可以配合jenkins传递参数 #!/u ...
- mac 安装geckodriver和chromedriver
Last login: Fri Apr :: on ttys000 (base) localhost:~ ligaijiang$ env TERM_PROGRAM=Apple_Terminal SHE ...
- [Git/GitHub] Tutorial 1. Git download and commit first project
1. Install at https://git-scm.com/downloads 2. Set up your name and email $ git config --global user ...
- JS控制文本框只能输入数字 \保留小数点后两位
<input type="text" placeholder="保留到小数点后两位" maxlength="200" onkeyup= ...
- 利用Tensorflow实现神经网络模型
首先看一下神经网络模型,一个比较简单的两层神经. 代码如下: # 定义参数 n_hidden_1 = 256 #第一层神经元 n_hidden_2 = 128 #第二层神经元 n_input = 78 ...
- iOS 测试企业应用的分发
开发者能够方便地来做iOS应用的测试分发,目前可以选用“浦公英”和“Fir.im”来做. 生成IPA文件 生成应用的 IPA 文件可以使用命令行 xcodebuild exportArchive -e ...
- DES加解密 cbc模式 的简单讲解 && C++用openssl库来实现的注意事项
DES cbc是基于数据块加密的.数据块的长度为8字节64bit.以数据块为单位循环加密,再拼接.每个数据块加密的秘钥一样,IV向量不同.第一个数据快所需的IV向量,需要我们提供,从第二个数据块开始, ...