往事随风三两斤 發表於 2025-11-14 09:51:00

MySQL DATETIME类型存储空间详解:从8字节到5字节的演变

<blockquote>
<p>MySQL系列文章</p>
<p>在MySQL数据库设计中,<code>DATETIME</code>类型用于存储日期和时间信息,但其存储空间大小<strong>并非固定不变</strong>,而是随MySQL版本迭代和精度定义动态变化。本文将详细说明其存储规则,并提供清晰的对比表格。</p>
</blockquote>
<h4 id="一核心结论"><strong>一、核心结论</strong></h4>
<ul>
<li><strong>MySQL 5.6.4 是分水岭</strong>:此前固定占用 <strong>8 字节</strong>;此后优化为 <strong>5 字节基础 + 精度附加空间</strong>。</li>
<li><strong>精度决定扩展空间</strong>:若定义小数秒(如 <code>DATETIME(3)</code>),需额外 <strong>1~3 字节</strong>。</li>
<li><strong>无精度定义时默认占 5 字节</strong>:现代MySQL(≥5.6.4)的常见场景。</li>
</ul>
<hr>
<h4 id="二存储空间对比表格"><strong>二、存储空间对比表格</strong></h4>
<table>
<thead>
<tr>
<th>MySQL 版本</th>
<th>是否支持小数秒</th>
<th>数据类型定义</th>
<th>存储空间</th>
<th>范围</th>
<th>存储格式</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>&lt; 5.6.4</strong></td>
<td>❌ 不支持</td>
<td><code>DATETIME</code></td>
<td><strong>8 字节</strong></td>
<td><code>'1000-01-01 00:00:00'</code> 至 <code>'9999-12-31 23:59:59'</code></td>
<td><code>YYYYMMDDHHMMSS</code>(整数)</td>
</tr>
<tr>
<td><strong>≥ 5.6.4</strong></td>
<td>✅ 支持</td>
<td><code>DATETIME</code> 或 <code>DATETIME(0)</code></td>
<td><strong>5 字节</strong></td>
<td>同上</td>
<td>优化的二进制打包格式</td>
</tr>
<tr>
<td><strong>≥ 5.6.4</strong></td>
<td>✅ 支持</td>
<td><code>DATETIME(1)</code> / <code>(2)</code></td>
<td><strong>6 字节</strong></td>
<td>同上(含小数秒)</td>
<td>基础5B + 1B精度扩展</td>
</tr>
<tr>
<td><strong>≥ 5.6.4</strong></td>
<td>✅ 支持</td>
<td><code>DATETIME(3)</code> / <code>(4)</code></td>
<td><strong>7 字节</strong></td>
<td>同上(含小数秒)</td>
<td>基础5B + 2B精度扩展</td>
</tr>
<tr>
<td><strong>≥ 5.6.4</strong></td>
<td>✅ 支持</td>
<td><code>DATETIME(5)</code> / <code>(6)</code></td>
<td><strong>8 字节</strong></td>
<td>同上(含小数秒)</td>
<td>基础5B + 3B精度扩展</td>
</tr>
</tbody>
</table>
<blockquote>
<p><strong>注</strong>:精度扩展空间计算公式:<code>5 + CEIL(fsp / 2)</code> 字节(<code>fsp</code>为小数秒位数,范围0-6)。</p>
</blockquote>
<hr>
<h4 id="三关键注意事项"><strong>三、关键注意事项</strong></h4>
<ol>
<li>
<p><strong>版本查询命令</strong><br>
确认MySQL版本是首要步骤:</p>
<pre><code class="language-sql">SELECT VERSION(); -- 输出示例:8.0.33
</code></pre>
</li>
<li>
<p><strong>精度定义检查</strong><br>
通过表结构查看是否定义小数秒:</p>
<pre><code class="language-sql">SHOW CREATE TABLE your_table;
</code></pre>
<p>若显示<code>created_at DATETIME(3)</code>,则表示精度为毫秒(占7字节)。</p>
</li>
<li>
<p><strong>空间优化建议</strong></p>
<ul>
<li>无小数秒需求时,直接使用 <code>DATETIME</code>(默认5字节);</li>
<li>需存储毫秒/微秒时,按业务需求选择最小精度(如<code>DATETIME(3)</code>);</li>
<li>旧版本升级后,建议检查表结构以利用空间优化。</li>
</ul>
</li>
</ol>
<hr>
<h4 id="四总结"><strong>四、总结</strong></h4>
<table>
<thead>
<tr>
<th>场景描述</th>
<th>存储空间</th>
</tr>
</thead>
<tbody>
<tr>
<td>MySQL 5.6.3及之前版本</td>
<td>8 字节</td>
</tr>
<tr>
<td>MySQL 5.6.4+,无小数秒(默认)</td>
<td><strong>5 字节</strong></td>
</tr>
<tr>
<td>MySQL 5.6.4+,含1-2位小数秒</td>
<td>6 字节</td>
</tr>
<tr>
<td>MySQL 5.6.4+,含3-4位小数秒</td>
<td>7 字节</td>
</tr>
<tr>
<td>MySQL 5.6.4+,含5-6位小数秒</td>
<td>8 字节</td>
</tr>
</tbody>
</table>
<p><strong>现代MySQL(≥5.6.4)中,<code>DATETIME</code>在未定义小数秒时仅需5字节</strong>,比旧版本节约37.5%存储空间。合理利用精度定义,可显著优化大规模数据存储效率。</p>
<blockquote>
<p>文章的最后,想和你多聊两句。</p>
<p>技术之路,常常是热闹与孤独并存。那些深夜的调试、灵光一闪的方案、还有踩坑爬起后的顿悟,如果能有人一起聊聊,该多好。</p>
<p>为此,我建了一个小花园——我的微信公众号「<strong>[努力的小郑]</strong>」。</p>
<p>这里没有高深莫测的理论堆砌,只有我对后端开发、系统设计和工程实践的持续思考与沉淀。它更像我的<strong>数字笔记本</strong>,记录着那些值得被记住的解决方案和思维火花。</p>
<p>如果你觉得今天的文章还有一点启发,或者单纯想找一个同行者偶尔聊聊技术、谈谈思考,那么,欢迎你来坐坐。<br>
<img src="https://img2024.cnblogs.com/blog/3703499/202601/3703499-20260105210259813-964799315.jpg"></p>
<p>愿你前行路上,总有代码可写,有梦可追,也有灯火可亲。</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/xzqcsj/p/19220623
頁: [1]
查看完整版本: MySQL DATETIME类型存储空间详解:从8字节到5字节的演变