前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[记录] MYSQL 时间类型在磁盘上的存储结构

[记录] MYSQL 时间类型在磁盘上的存储结构

原创
作者头像
大大刺猬
发布2023-04-28 09:55:42
9910
发布2023-04-28 09:55:42
举报
文章被收录于专栏:大大刺猬

本文主要讲mysql的时间类型在磁盘上的存储结构(innodb)

时间类型

mysql时间类型主要有如下几种 (5.6.4之后的版本)

类型

占用空间

字节序

取值范围

date

3

大端

'1000-01-01' to '9999-12-31'

time(n)

3+N

大端

'-838:59:59.000000' to '838:59:59.000000'

datetime(n)

5+N

大端

'1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'

timestamp(n)

4+N

大端

'1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999'

N的取值来自于n(fractional-seconds), 关系如下

代码语言:javascript
复制
N = int((n+1)/2)

n

N

0

0

1,2

1

3.4

2

5,6

3

存储结构

date

从左到右为:

代码语言:javascript
复制
1  bit  sign
14 bit  year
4  bit  month
5  bit  day

一共24bit, 就是3字节

怎么取出来呢? 这里使用python演示一下

代码语言:javascript
复制
year = ((date & ((1 << 14) - 1) << 9) >> 9)
# 构造出需要的长度14位的1.   (1 << 14) - 1)
# 将构造好的数据移动到对于的位置,这里就是向左移动9位, 就是23<-->9 
# 与目标数做与运算 得到 除了23<-->9 位的数不变外, 其它数均为0.  1与(1/0)得(1/0)   0与(1/0)得0
# 将与后的数据, 去掉后面的0, (右移9位, 就是刚才左移的9位).

time

从左到右为

代码语言:javascript
复制
1  bit  sign
11 bit  hour  (实际上是10bit, 还有位是保留位, 不过不影响取值..)
6  bit  minute
6  bit  second

一共就是24bit, 3字节

datetime

代码语言:javascript
复制
1bit符号  year_month:17bit  day:5  hour:5  minute:6  second:6

year = int(year_month/13)

month = int(year_month%13)

timestamp

这个就是秒数(uint32), 直接取值即可

代码语言:javascript
复制
int.from_bytes(bdata[:4],'big')

分秒

如果固定时间类型后面还有数据,则是分秒(小数部分的秒fraction)

大端,直接取值即可.比如:

代码语言:javascript
复制
fraction = int.from_bytes(bdata[4:],'big') if len(bdata)>4 else None

参考: https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 时间类型
  • 存储结构
    • date
      • time
        • datetime
          • timestamp
            • 分秒
            相关产品与服务
            云数据库 MySQL
            腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档