MySQL 可使用许多类型来保存日期和时间值。
函数
如:YEAR和DATE。MySQL能存储的最小时间粒度为秒(MariaDB支持微秒级别的时间类型)。可是MySQL也可使用微妙级的粒度进行临时运算,咱们会展现怎么绕开这种存储限制。
spa
DATETIME
排序
这个类型能保存大范围的值,从1001年到9999年,精度为秒。它把日期和时间封装到格式为YYYYMMMDDHHHMMSS的整数中,与时区无关。使用8个字节的存储空间。
字符串
默认状况下,MySQL以一种可排序的无歧义的格式显示 DATETIME值,例如“2015-10-24 09:57:33”.这是ANSI标准定义的日期和时间表示方法。效率
TIMESTAMP
打包
就像它的名字同样,TIMESTAMP类型保存了1970年1月1日0点(格林尼治标准时间)以来的秒数,它和UNIX时间戳相同。TIMESTAMP只使用4个字节的存储空间,所以它的范围比DATETIME小的多:只能存储 1970 到 2038年。
数据类型
若是在多个时区存储或访问数据,TIMESTAMP和DATETIME的行为将很不同。二进制
TIMESTAMP提供的值与时区有关系,后者刚保留文本表示的日期和时间。方法
也能够指定TIMESTAMP的 添加 与更新的行为,TIMESTAMP列的默认为NOT NULL技术
除了特殊的行为以外 ,一般也应该尽可能用TIMESTAMP,由于它比DATETIME空间效率更高有时候人们会将Unix时间戳存储为整数值,但这不会带来任何收益。用整数保存时间戳的格式一般不方便处理,因此不推荐这样作。
若是须要存储比秒更小的粒度日期和时间怎么办?
MySQL目前没有提供合适的数据类型,可是能够经过使用本身的格式存储: 可使用BIGINT类型存储微级别的时间戳,或者使用DOUBLE存储秒以后的小数部分。这两种方式,均可以,或者可使用MariaDB替代MySQL
MySQL有少数几种存储类型使用紧凑的位存储数据。全部这些位类型,无论底屋存储格式和处理方式若是 ,从技术上来讲都是字符串类型。
BIT
在MySQL 5.0 以前,BIT是TINYINT的同义词。可是在MySQL5.0以及更新的版本,这是一个特性彻底不一样的数据 类型。
BIT列,能够存储一个或多个ture/false 值。BIT(1)定义一个包含单个位字段,BIT(2)存储2个位,BIT例最大长度是64个位。
MySQL把BIT看成字符串类型,而不是数字类型,当检索BIT(1)的值是一个包含二进制0或1的字符串,而不是ASCII码的“0”或“1”。然而在数字 上下文场景中检索时,结果将是位字符串转换成的数字 。须要和另外的值比较结果 ,必定要记得这一点。
对于大部分应用,最好避免使用这种类型。
SET
若是须要在保存不少的true/false 值,能够考虑,合并这些列到一个SET数据类型,它在MySQL内部是以一系列打包的位的集合来表示的。这样就有效的我利用了存储空间,而且MySQL有像FIND_IN_SET()和FILED()这样的函数,方便地在查询 中使用。
缺点:改变列的定义代价较高:须要ALTER TABLE ,这对大表来讲是很是昂贵的操做。