文档章节

mysql 精确到毫秒

EasonW
 EasonW
发布于 2016/07/14 18:45
字数 953
阅读 66
收藏 0

现在很多团队在做去o的项目,迁移mysql时,为了便于binlog分析,请务必对每张表都增加ts字段。

条件:mysql5.6

My.cnf中修改参数

explicit_defaults_for_timestamp = 0

 

且该字段需要精确到毫秒,而now()函数是不支持毫秒的

 

且建表时,只设置ts字段为timstamp类型,其他时间字段请用datetime类型,mysql只允许第一个timestamp类型的字段可以精确到毫秒。

 

由此,需要建表的时候这样定义字段:

create table presort_test(id int,ts timestamp(6) not null);

 

然后在insert时不需要给ts字段赋值:

insert into presort_test(id) values(3); 

 

 

另外关于datetime & timestamp的区别如下:

datetime 
1. 占用8个字节 
2. 允许为空值,可以自定义值,系统不会自动修改其值。 
3. 实际格式储存(Just stores what you have stored and retrieves the same thing which you have stored.) 
4. 与时区无关(It has nothing to deal with the TIMEZONE and Conversion.) 
5. 不可以设定默认值,所以在不允许为空值的情况下,必须手动指定datetime字段的值才可以成功插入数据。 
6. 可以在指定datetime字段的值的时候使用now()变量来自动插入系统的当前时间。 

timestamp 
1. 占用4个字节 
2. 允许为空值,但是不可以自定义值,所以为空值时没有任何意义。 
3. TIMESTAMP值不能早于1970或晚于2037。这说明一个日期,例如'1968-01-01',虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个对象将被转换为0。 
4.值以UTC格式保存( it stores the number of milliseconds) 
5.时区转化 ,存储时对当前的时区进行转换,检索时再转换回当前的时区。 
6. 默认值为CURRENT_TIMESTAMP(),其实也就是当前的系统时间。

 

 

请大家建表时注意,以下是我做测试的代码,给大家参考:

 

[root@PT-17089 bin]# mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 2125755 
Server version: 5.6.16-log MySQL Community Server (GPL) 

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. 

Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> use test 
Database changed 

mysql> create table presort_test(id int,ts timestamp(6) not null); 
Query OK, 0 rows affected (0.02 sec) 

mysql> insert into presort_test values(1,now()); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from presort_test \G; 
*************************** 1. row *************************** 
id: 1 
ts: 2016-07-14 18:06:35.000000 
1 row in set (0.00 sec) 

ERROR: 
No query specified 

mysql> insert into presort_test values(2,now()); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from presort_test \G; 
*************************** 1. row *************************** 
id: 1 
ts: 2016-07-14 18:06:35.000000 
*************************** 2. row *************************** 
id: 2 
ts: 2016-07-14 18:16:17.000000 
2 rows in set (0.00 sec) 

mysql> insert into presort_test(id) values(3); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from presort_test 
-> ; 
+------+----------------------------+ 
| id | ts | 
+------+----------------------------+ 
| 1 | 2016-07-14 18:06:35.000000 | 
| 2 | 2016-07-14 18:16:17.000000 | 
| 3 | 2016-07-14 18:23:19.562072 | 
+------+----------------------------+ 
3 rows in set (0.00 sec) 

mysql> insert into presort_test(id) values(4); 
Query OK, 1 row affected (0.00 sec) 

mysql> select * from presort_test; 
+------+----------------------------+ 
| id | ts | 
+------+----------------------------+ 
| 1 | 2016-07-14 18:06:35.000000 | 
| 2 | 2016-07-14 18:16:17.000000 | 
| 3 | 2016-07-14 18:23:19.562072 | 
| 4 | 2016-07-14 18:25:08.529071 | 
+------+----------------------------+ 
4 rows in set (0.00 sec)

 

 

--------------------------------------------------------------------------------------

只设置ts字段为timstamp类型,其他时间字段请用datetime类型,mysql只允许第一个timestamp类型的字段可以精确到毫秒。

 

mysql> alter table presort_test add column ts1 timestamp(6) not null; 
Query OK, 0 rows affected (0.02 sec) 
Records: 0 Duplicates: 0 Warnings: 0

 

mysql> insert into presort_test(id) values(5); 
Query OK, 1 row affected (0.00 sec)

 

mysql> select * from presort_test; 
+------+----------------------------+----------------------------+ 
| id | ts | ts1 | 
+------+----------------------------+----------------------------+ 
| 1 | 2016-07-14 18:06:35.000000 | 0000-00-00 00:00:00.000000 | 
| 2 | 2016-07-14 18:16:17.000000 | 0000-00-00 00:00:00.000000 | 
| 3 | 2016-07-14 18:23:19.562072 | 0000-00-00 00:00:00.000000 | 
| 4 | 2016-07-14 18:25:08.529071 | 0000-00-00 00:00:00.000000 | 
| 5 | 2016-07-14 18:35:29.702059 | 0000-00-00 00:00:00.000000 | 
+------+----------------------------+----------------------------+ 
5 rows in set (0.00 sec)

© 著作权归作者所有

共有 人打赏支持
EasonW
粉丝 1
博文 1
码字总数 953
作品 0
大兴
项目经理
mysql 以天为单位 统计订单数量

SELECT count(*) as num, dateformat(FROMUNIXTIME(createDate/1000),'%y-%m-%d') sdate from carorder c GROUP BY sdate 注意:如果我们存放的字段createDate 是精确到毫秒的,那么在转化成......

岸芷汀兰
2015/07/04
0
0
全局唯一ID生成服务--snowflake-PHP

Twitter在把存储系统从MySQL迁移到Cassandra的过程中由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。 1 41位的时间序列(精确到毫秒,41位的长度可以使...

zhouyuan24
2013/11/19
6.2K
0
系统开发中的时间类型的处理问题

这两天做了个测试程序放到cloudfoundry上,测试的时候突然发现系统中对日期时间类型的数据处理在云环境下存在问题。 仔细思考以后发现这个问题是一直存在的,只是以前自己做的系统没有考虑到...

chuangyu
2013/05/07
0
0
分布式自增 ID 算法--Snowflake

Twitter在把存储系统从MySQL迁移到Cassandra的过程中,由于Cassandra没有顺序ID生成机制,于是自己开发了一套全局唯一ID生成服务:Snowflake。优点是:高性能,低延迟;独立的应用;按时间有...

匿名
2016/06/16
6.1K
5
MySQL数据库表设计最佳实践——《高性能MySQL》第三版第四章学习笔记

1.选择合适的数据类型 MySQL的表是由多个字段组成的,那字段的类型改如何选择才更优呢? 1.1通用原则 1.1.1尽可能小 怎么做? 在满足业务需求的前提下,适当考虑20%的富余量,选择尽可能小的...

杨武兵
2015/10/01
396
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内存模型是怎么解决缓存一致性的?

在再有人问你Java内存模型是什么,就把这篇文章发给他。这篇文章中,我们介绍过关于Java内容模型的来龙去脉。 我们在文章中提到过,由于CPU和主存的处理速度上存在一定差别,为了匹配这种差距...

Java填坑之路
13分钟前
1
0
vue-cli 3.0 初体验

最近复习了下vue,突然发现vue-cli已经更新到3.0版本了,并且变化蛮大,看来要不停的学习,真是一入前端深似海。 安装步骤: 1、全局安装 npm install -g @vue/cli Vue CLI 的包名称由 vue-...

tianyawhl
14分钟前
0
0
Angular进阶之路

【初级】会写页面,能出东西。 给定环境和 rest API,不用第三方库,能在十分钟内完成一个 master/detail 结构的带路由的应用(可以不管美观)。 知识点:Angular CLI、组件、路由、HTTP 服务...

陆小七的主页
17分钟前
0
0
Redis缓存数据库安全加固指导(一)

背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一位,但是原生...

中间件小哥
17分钟前
0
0
百万级数据mysql分区

1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。 2. 表分区与分表的区别 分表...

罗文浩
20分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部