数据仓库储存款和储蓄时间的时区难点,数据类型

先说一下mysql中DATETIME和TIMESTAMP的界别

先说一下mysql中DATETIME和TIMESTAMP的分别


  1. 采纳最小的数据类型,因为它们占更加少的磁盘,内部存款和储蓄器和CPU缓存;

  2. 慎选轻便的数据类型,如用整型来存款和储蓄ip: 

  3. 防止null,因为null会占用存款和储蓄空间,null在索引列上会使索引更扑朔迷离

     

TIMESTAMP是正统的unix
timestamp,它存款和储蓄的是一玖6七-壹-一到现行反革命经过的秒数,四字节囤积。mysql用那一个项目还蛮方便的,三个是有众多放到的函数和trigger来管理它,比如CURRENT_TIMESTAMP宏,最注重的是在取多少的时候mysql会活动帮你管理DST和时区的难题。

TIMESTAMP是专门的学业的unix
timestamp,它存款和储蓄的是1967-一-一到近日经过的秒数,四字节囤积。mysql用那个项目还蛮方便的,贰个是有广大放权的函数和trigger来管理它,例如CURRENT_TIMESTAMP宏,最要害的是在取多少的时候mysql会活动帮您处理DST和时区的难点。

title: mysql-数据类型
date: 2016-12-28 17:42:45
tags:
categories: mysql

平头档期的顺序

DATETIME的限定更加大,好像能够从0000-00-00 00:00:00到999玖-1贰-31
二3:5九:5玖,捌字节囤积,当然mysql内部明显也是用整数而不是字符串的(说了是八字节了),所以功能不是大主题材料。但DATETIME不带时区,比方自个儿在程序里生成了一个二〇一五-0伍-07
一伍:二陆:00的时间(实际上是+八时区的,但那几个目标大概是timezone
naive)的,存到mysql里,再从区别时区的地点拿出来,那一个日子也许就混了。

DATETIME的界定更加大,好像能够从0000-00-00 00:00:00到999玖-1二-31
贰叁:5九:5九,8字节积存,当然mysql内部肯定也是用整数而不是字符串的(说了是八字节了),所以功用不是大难点。但DATETIME不带时区,比如作者在先后里生成了二个201伍-0五-07
一⑤:二6:00的年华(实际上是+8时区的,但以此目的可能是timezone
naive)的,存到mysql里,再从不相同时区的地方拿出去,那几个小时大概就混了。


  1. TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT 分别使用八,1陆,2四,3贰,63位存款和储蓄空间;

  2. 分选unsigned属性,能够使正数的上限提升级中学一年级倍;

  3. 使不应用unsigned属性,跟质量无关;

  4. int(1)和int(十)对存款和储蓄和测算的话是均等的,只是显明部分mysql交互工具用来限制显示字符的个数;

但TIMESTAMP也有两个非常大的主题素材:

数据仓库储存款和储蓄时间的时区难点,数据类型。但TIMESTAMP也有几个十分的大的难题:

《高质量mysql》第陆章读书笔记

实数类型

  1. 四字节长度限制,它只好到203捌年
  2. 无数时候大家期望依据用户所在地的时区呈现时间而不是光突显3个服务器时间
  1. 四字节长度限制,它只可以到203八年
  2. 许多时候大家期待遵照用户所在地的时区彰显时间而不是光呈现多个服务器时间

数字类型

mysql的数字大约分为三种整数类型和实数类型(既小数类型)

  1. 能够行使DE科帕奇L存款和储蓄比BIGINT还大的整数;

  2. CPU不帮助DEFITL直接总括,MYSQL服务器本人完结了DECIVICL的高精度运算,相对来讲,CPU直接帮忙浮点运算,所以浮点运算显明更加快;

  3. float占用4个字节,double占用8个字节;

  4. DE轩逸L供给额外的半空二月计算开支,所以尽量少用它;

  5. DE桑塔纳L能够利用BIGINT替代,把小数乘以好几倍存款和储蓄在BIGINT里面,能够制止浮点存款和储蓄计算不标准和DEMARCHL精度总括代价高的主题素材;

为此相比较好的做法是,数据库中利用DATETIME,然后存时间的时候一律用程序生成UTC时间(而不是local时区的时间)存进去,抽取来的时候不管想展现服务器时间依然显得用户的时日都足以拍卖。

于是相比好的做法是,数据库中接纳DATETIME,然后存时间的时候一律用程序生成UTC时间(而不是local时区的岁月)存进去,收取来的时候不管想显示服务器时间或然突显用户的时间都足以管理。

平头体系

TINYINT SMALLINT MEDIUMINT INT BIGINT
8位 16位 24位 32位 64位

mysql中按从小到大学一年级个三种平头项目,对应在java应用中,大家一般平时使用int对应java的integer,bigint对应java的long,因为java的integer刚好是6个字节,long七个字节。

小心成立表的时候整数类型前边的括号,例如int(3),并不是表示能够有最多3个字符的平头,既-999到99玖。它的实际效能是限量有个别客户端工具显示数字的时候只彰显……1个数!所以实际没啥用,带不带都足以

平头和小数类型都足以带上
unsigned,表示不不存负数,那样能够大学一年级位。比方tinyint本来是-12八~127,而unsigned
tinyint表示 0~255

字符串类型

顺手提一句,依照用户所在地时区突显时间有二种做法:

附带提一句,依照用户所在地时区展现时间有两种做法:

实数类型

float和double分别占有多少个字节和九个字节。当超过位数后,依照肆舍5入保存近似值。这在保存钱之类的高精度数字时是很惊恐的,所以就别用好了!

float和double同时也足以选取如float(5,2)那样的体裁来强制规定,小数位+整数位壹共只好八个人,小数位只保留三个人。当个位数超越时,mysql拒绝插入,当小数位超越时,四舍五入。不过那实质上及其令人吸引。

再者当您用相关列做规范查询时,未有在括号中制定精度的float会导致查询退步,必须钦赐精度

997755.com澳门葡京 ,比如

money字段 设置为float,

insert into table (num) values (0.12);

select * from table where num=0.1二的话,查不出任何数据。

而假若内定了精度,比方money float(陆,2) //当先七位就起来取近似值了

insert into table (num) values (0.12);

select * from table where num=0.12的话,得到数码。

对照decimal(m,n)更易于精通,正是最多m位,小数最多n位抢先后四舍5入(据悉有些3.0之下的版本因为是转换到double之类的门类,行为不雷同)

decimal的优势在于不会莫明其妙的在整数位4舍5入,但是在任然要小心超越限定后,小数位的四舍⑤入是不是是你想要的,恐怕直接用bigint存款和储蓄你的数字好了,存取的时候乘除相应的小数位就可以

  1. varchar供给1个要么多个附加的字节记录字符串长度,varchar列的长度小于或等于25二个字节须求3个字节,大于25五索要八个字节;

  2. varchar 用于存款和储蓄可变长字符串,它比定长类型更省去空间;

  3. char适合积攒十分的短的字符串,大概有所值都接近同三个长短;

  4. 对此时常转移的数码,char比varchar越来越好,因为定长的char类型不易于发生碎片;

  5. 对此仓库储存不够长的列,char存款和储蓄空间比varchar少,如存款和储蓄“Y”或”N”,采取单字节字符集,char(1)占用一个字节;varchar(一)占用四个字节;

  6. 当存储char值时,mysql会删除全部末尾空格,char值会依据需求选用空格举行填空相比较;

  7. varchar(伍)和varchar(200)存储”hello”的上空开采是如出1辙的。但越来越长的列会消耗更加多的内部存储器,因为mysql经常会分配一定大小的内部存款和储蓄器块来保存内部值;

     

  1. 当用户率先次访问网址的时候,用js获取时区发送到服务器上存到session里
  2. 用js管理时间的展示(小编觉着那种相比较便宜一点,终归不用改服务端代码)
  1. 当用户率先次访问网址的时候,用js获取时区发送到服务器上存到session里
  2. 用js管理时间的展现(笔者觉着那种相比有利一点,毕竟不用改服务端代码)

字符串类型

BLOB和TEXT类型

利用那种做法的唯一缺点是sqlite三未有internal的DATETIME类型,所以在OHummerH二M框架如sqlalchemy中,它会直接存字符串进去。(sqlite三的文书档案也说,你要么存成int要么real要么字符串)。就算那或然带来一些不方便人民群众和属性的大跌,但自己觉着依然符合“keep
it simple and stupid”的尺码。

行使那种做法的唯一缺点是sqlite三未有internal的DATETIME类型,所以在OCRUISERM框架如sqlalchemy中,它会一贯存字符串进去。(sqlite3的文书档案也说,你照旧存成int要么real要么字符串)。尽管那只怕带来一些不方便人民群众和品质的骤降,但自己觉着依然符合“keep
it simple and stupid”的原则。

char和varchar

前端是定长,后者是边长

万般在innodb引擎中大家都选用varchar。

唯独有时在存的多寡长度一定时,比方身份证。

依然值平时转移的字段使用char,省掉总结数据长度的时光,mysql会快点。

正如诡异的是使用char的时候,字符串末尾假设是空格,会被截断,不被存下来。

除此以外varchar(贰)代表的能够存三个字符,不论你是存的中文还是英文都以三个,跟oracle区别。

  1. BLOB和TEXT分别使用二进制和字符存款和储蓄;

  2. MYSQL不可能将BLOB和TEXT列全体尺寸字符串进行索引,也不可能用那个索引化解排序;

有关用INT存时间,是另一种有效的办法,参见http://www.liaoxuefeng.com/article/0014132675721847f569c3514034f099477…
自身个人不是很欣赏那样做,因为这么你必须把模型中象征时间的积极分子声称为int类型。那样是相比较不符合逻辑的(那些Date呀Datetime之类的类就不曾用了哟,最多就有个Dateutil就好了),而且会使得程序不易读(卧槽那个publishedDate为何是int,它究竟意味着的是时刻呢?)。不问可见见仁见智。

关于用INT存时间,是另一种有效的艺术,参见http://www.liaoxuefeng.com/article/0014132675721847f569c3514034f099477…
自家个人不是很喜爱那样做,因为那样你必须把模型中意味着时间的积极分子声称为int类型。那样是相比不相符逻辑的(那1个Date呀Datetime之类的类就不曾用了哟,最多就有个Dateutil就好了),而且会使得程序不易读(卧槽这些publishedDate缘何是int,它毕竟意味着的是光阴吧?)。综上说述见仁见智。

blob和text

额,考虑用nosql来存吧。

日期和时间档期的顺序

时光项目

  1. MYSQL能够积攒的小时辰间是秒;

  2. DATETIME能保留大范围的值,从100一年到999九年,精度为秒。它把日子和岁月封装到格式为YYYYMMDDHHMMSS的整数中,与时区非亲非故,使用几个字节存款和储蓄;

  3. 私下认可情形下,MYSQL以一种有种种,无歧义的格式显示DATETIME值,比如”2014-12-12
    1二:1二:12″;

  4. TIMESTAMP
    用5个字节存款和储蓄,和UNIX时间戳同样,它只好表示壹玖陆7年到203八年,它的显得格式比如”201四-1二-12
    12:12:12″;;

  5. MYSQL提供了FROM_UNIXTIME()函数把UNIX时间戳转换到日期,并提供UNIX_TIMESTAMP()函数把日子转为UNIX时间戳;

  6. TIMESTAMP 信赖于时区;

  7. 当插入或改换记录时,假若TIMESTAMP未有点名值,TIMESTAMP暗许会保存当前岁月;

  8. TIMESTAMP比DATETIME的空中效能更加高,尽量挑选TIMESTAMP;

  9. 能够选择BIGINT存款和储蓄微妙级其他岁月戳,也许选拔DOUBLE保留秒之后的小数部分;

DATETIME和TIMESTAMP

二者在显示的精度上并无分裂,都以正确到秒

不等的是datetime底层存的实际是格式为YYYYMMDDHHMMSS,使用捌个字节存款和储蓄的平头中,所以实际这么些类型是平昔不时区的定义的,你存的多少正是不怎么。

但是timestamp是将你存的时日根据时区存为了unixtime,只占用四个字节。

据此其出示也借助于mysql
server上的时区,所以它只可以存到2038年为上限,存款和储蓄一些前景光阴的时候要注意(不上心也没涉及,反正你存不进来)。

卓越类型数据

date和time

当你只想保留年月日只怕时分秒时使用

一.IPv四地址常常被人用varchar(15)来囤积,不过它3十三位无符号的整数,小数点将地点分肆段只是为了令人轻便阅读,所以整型来储存它,MYSQL用INET_ATON()
和INET_NTOA()用于那二种象征调换;

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website