mysql datetime和timestamp的数据存储格式

MySQL中DateTime与Timestamp的区别
本文详细介绍了MySQL中datetime和timestamp两种数据类型的存储方式及其占用的空间大小。对比了5.6.4版本前后datetime类型的变化,并解释了timestamp类型的具体存储原理。

datetime在mysql5.6.4之前占用8个字节,在mysql5.6.4及以后,占用5-8个字节。

差别是5.6.4及之后对秒数小数位(Fractional Seconds)的精度不同,存储所需的空间也不同,最高支持到微秒(比如:2015-12-20 10:01:00.999999.),需要额外的3个字节。

timestamp在mysql里实际是存储的从UTC时区1970-01-01 00:00:01到对应时间的时间差,需要用4个字节存储,实际上相当于int(11)。timestamp只能存储从1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07的范围,如果日期超过2038年,就要使用datetime。

另外,datetime占用的5个字节是怎么分配的?

 1 bit  sign           (1= non-negative, 0= negative)
17 bits year*13+month  (year 0-9999, month 0-12)
 5 bits day            (0-31)
 5 bits hour           (0-23)
 6 bits minute         (0-59)
 6 bits second         (0-59)
---------------------------
40 bits = 5 bytes

 

### MySQL 中 `datetime` 数据类型的存储格式与内部结构 在 MySQL 中,`datetime` 是一种用于存储日期时间组合的数据类型。其实际存储格式内部结构如下: #### 1. **存储大小** `datetime` 类型占用固定的 8 字节存储空间[^5]。 #### 2. **日期范围** `datetime` 可以表示从 `1000-01-01 00:00:00` 到 `9999-12-31 23:59:59` 的日期范围[^5]。这使得它适用于大多数需要长时间跨度的应用场景。 #### 3. **内部存储结构** MySQL 使用两个部分来存储 `datetime` 值: - **前 4 字节**:用于存储自基准日期(通常是 `1900-01-01` 或其他特定起始点)以来的天数差值。这个值可以是正值或负值,分别代表基准日期之后或之前的天数。 - **后 4 字节**:用于存储当天内的具体时间(小时、分钟、秒以及可选的小数秒)。这部分记录的是从午夜开始经过的时间,通常以毫秒为单位计算。 这种设计允许 `datetime` 同时保存完整的日期信息高精度的时间戳[^5]。 #### 4. **小数秒支持** 从 MySQL 5.6.4 版本开始,`datetime` 支持微秒级别的精度,最多可达 6 位小数。这意味着除了标准的时间外,还可以额外存储形如 `.123456` 的小数秒部分。启用此功能不会改变整体的固定长度(仍为 8 字节),而是通过调整内部编码方式实现更高的分辨率[^5]。 以下是 Python 插入带小数秒的 `datetime` 示例代码: ```python import pymysql from datetime import datetime connection = pymysql.connect(host='localhost', user='root', password='', db='test') try: with connection.cursor() as cursor: sql = "INSERT INTO test_table (dt_column) VALUES (%s)" value = datetime(2023, 10, 5, 12, 30, 45, 678901) # 包含微秒的部分 cursor.execute(sql, (value,)) finally: connection.close() ``` #### 5. **与其他类型的区别** 虽然 `timestamp` `datetime` 都能处理时间日期,但它们之间存在显著差异: - `timestamp` 占用较少的空间(仅需 4 字节),但它受限于较小的有效范围(`1970-01-01 00:00:01 UTC` 至 `2038-01-19 03:14:07 UTC`)[^3]。 - 对比之下,`datetime` 提供更大的灵活性,在超出 `timestamp` 能力的情况下更为适用。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值