日期和时间类型
MySQL 可以使用许多类型来保存日期和时间值例如YEAR 和DATEMySQL 能存储的最小时间粒度为秒(MariaDB 支持微秒级别的时间类型)但是MySQL 也可以使用微秒级的粒度进行临时运算我们会展示怎么绕开这种存储限制
大部分时间类型都没有替代品因此没有什么是最佳选择的问题唯一的问题是保存日期和时间的时候需要做什么MySQL 提供两种相似的日期类型DATETIME 和TIMESTAMP对于很多应用程序它们都能工作但是在某些场景一个比另一个工作得好让我们来看一下
DATETIME
这个类型能保存大范围的值从 年到 年精度为秒它把日期和时间封装到格式为YYYYMMDDHHMMSS 的整数中与时区无关使用 个字节的存储空间
默认情况下MySQL 以一种可排序的无歧义的格式显示DATETIME 值例如 ::这是ANSI 标准定义的日期和时间表示方法
TIMESTAMP
就像它的名字一样TIMETAMP 类型保存了从 年 月 日午夜(格林尼治标准时间)以来的秒数它和UNIX 时间戳相同TIMESTAMP 只使用 个字节的存储空间因此它的范围比DATETIME 小得多只能表示从 年到 年MySQL 提供了FROM_UNIXTIME() 函数把Unix 时间戳转换为日期并提供了UNIX_TIMESTAMP() 函数把日期转换为Unix 时间戳
MySQL 以及更新的版本按照DATETIME 的方式格式化TIMESTAMP 的值但是MySQL 以及更老的版本不会在各个部分之间显示任何标点符号这仅仅是显示格式上的区别TIMESTAMP 的存储格式在各个版本都是一样的
TIMESTAMP 显示的值也依赖于时区MySQL 服务器操作系统以及客户端连接都有时区设置
因此存储值为 的TIMESTAMP 在美国东部时区显示为 ::与格林尼治时间差 个小时有必要强调一下这个区别如果在多个时区存储或访问数据TIMESTAMP 和DATETIME 的行为将很不一样前者提供的值与时区有关系后者则保留文本表示的日期和时间
TIMESTAMP 也有DATETIME 没有的特殊属性默认情况下如果插入时没有指定第一个TIMESTAMP 列的值MySQL 则设置这个列的值为当前时间注在插入一行记录时MySQL 默认也会更新第一个TIMESTAMP 列的值(除非在UPDATE 语句中明确指定了值)你可以配置任何TIMESTAMP 列的插入和更新行为最后TIMESTAMP 列默认为NOT NULL这也和其他的数据类型不一样
除了特殊行为之外通常也应该尽量使用TIMESTAMP因为它比DATETIME 空间效率更高有时候人们会将Unix 时间截存储为整数值但这不会带来任何收益用整数保存时间截的格式通常不方便处理所以我们不推荐这样做
如果需要存储比秒更小粒度的日期和时间值怎么办? MySQL 目前没有提供合适的数据类型但是可以使用自己的存储格式可以使用BIGINT 类型存储微秒级别的时间截或者使用DOUBLE 存储秒之后的小数部分这两种方式都可以或者也可以使用MariaDB替代MySQL
返回目录高性能MySQL
编辑推荐
ASPNET MVC 框架揭秘
Oracle索引技术
ASP NET开发培训视频教程
数据仓库与数据挖掘培训视频教程