Oracle日期类型占用的空间

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Oracle日期类型占用的空间

Oracle日期类型占用的空间

今天同事问了一个问题,

Oracle中日期类型字段,占用多少空间?

请别琢磨,第一时间你是否能说出答案?

咋一问可能会有些茫然,只要我们动动手,就能得到答案。

首先,Oracle中常见的日期类型字段,可以说有两种,

  1. DATE类型,存储的是“年月日时分秒”。

  2. TIMESTAMP类型,存储的是“年月日时分秒,以及毫秒”。

创建一张测试表,含有DATE和TIMESTAMP两种类型,

SQL create table a (a date, b timestamp); Table created.

插入测试数据,

SQL insert into a values(sysdate, systimestamp); 1 row created.

SQL insert into a values(to_date('2017-01-01','yyyy-mm-dd'), to_date('2017-01-01','yyyy-mm-dd')); 1 row created.

SQL commit; Commit complete.

根据数据字典user_tab_cols看,DATE类型的长度是7byte,TIMESTAMP类型的长度是11byte,

Oracle日期类型占用的空间

我们使用dump函数,DATE类型的长度len也是7byte,

Oracle日期类型占用的空间

TIMESTAMP类型的长度len也是11byte,注意第二条记录,由于使用的是to_date,实际存储的是DATE(向TIMESTAMP类型),并不是时间戳TIMESTAMP类型的值。

Oracle日期类型占用的空间

使用VSIZE函数,也是一样的结论,

Oracle日期类型占用的空间

是不是没有例外?我们再看一下SYSDATE函数,他应该是一个DATE类型的值,我们注意此处len长度就是8byte,不是DATE类型7byte,而且Typ值是13,DATE类型Typ值是12,TIMESTAMP类型Typ值是180,说明这是不同的类型,

Oracle日期类型占用的空间

有篇帖子(http://www.itpub.net/thread-1301776-1-1.html),阐明了其中原因,Typ=13是一种外置的DATE数据类型,他是一种内部C结构体,依赖于C编译器如何表示结构,长度有所不同,

Notice the type for sysdate. It is 13, not 12. 13 is the external DATE datatype. External datatype 13 is an internal c-structure whose length varies depending on how the c-compiler represents the structure. Note that the “Len=” value is 8 and not 7. Type 13 is not a part of the published 3GL interfaces for Oracle and is used for date calculations mainly within PL/SQL operations.

另外,杨长老曾经对于数据类型,写过一些文章,介绍了一些鲜为人知的知识,可以参考《Oracle基本数据类型存储格式浅析(三)——日期类型(三)》(http://blog.itpub.net/4227/viewspace-68517/)。

对于一些疑问,最好的方式就是动手实践,知识点可能很碎,但只要积累起来,一定是笔财富。

如果您觉得本文有帮助,欢迎关注转发:bisal的个人杂货铺,

Oracle日期类型占用的空间 Oracle日期类型占用的空间
本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> Oracle日期类型占用的空间


 上一篇
表访问授权问题 表访问授权问题
生产环境,通常会创建一些角色,然后将表的读写权限,授予角色再将其授予用户,简单讲就是用角色封装权限,有些很像开发中的面向对象。 同事问了个问题, 1. 将一张表读权限授予角色。 2. 将角色授予用户。 3. 删除这张表,再新
下一篇 
困扰许久的一个ORA-00060错误解决 困扰许久的一个ORA-00060错误解决
这段时间应用一直被一个诡异的ORA-00060的错误所困扰,众所周知,造成ORA-00060的原因是由于应用逻辑,而非Oracle数据库自己,之所以说诡异(“诡异”可能不准确,只能说这种场景,以前碰见的少,并未刻意关注),是因为这