<a href="http://blog.51cto.com/maclean/1277554#">?</a>
<code>SQL> </code><code>select</code> <code>vsize(123) </code><code>from</code> <code>dual;</code>
<code>VSIZE(123)</code>
<code>----------</code>
<code>3</code>
<code>SQL> </code><code>select</code> <code>dump(123,16) </code><code>from</code> <code>dual;</code>
<code>DUMP(123,16)</code>
<code>--------------------</code>
<code>Typ=2 Len=3: c2,2,18</code>
<code>/* 可以看到Oracle存储数字123需要用到3个字节的空间,其16进程形式为c2,02,18 */</code>
<code>/* 如果是gooooogle(1后面跟n个零)呢? * /</code>
<code>SQL> </code><code>select</code> <code>vsize(power(10,38)) </code><code>from</code> <code>dual;</code>
<code>VSIZE(POWER(10,38))</code>
<code>-------------------</code>
<code> </code><code>2</code>
<code>SQL> </code><code>select</code> <code>dump(power(10,38),16) </code><code>from</code> <code>dual;</code>
<code>DUMP(POWER(10,38)</code>
<code>-----------------</code>
<code>Typ=2 Len=2: d4,2</code>
<code>/* power(10,38)居然仅占用2个字节空间,其16进程形式为d4,02 */</code>
<code>/* 这是真的吗? * /</code>
<code>/* 目前number类型最大为38位 */</code>
<code>SQL> </code><code>create</code> <code>table</code> <code>YOUYUS (t1 number(38,0)) tablespace users;</code>
<code>Table</code> <code>created.</code>
<code>SQL> </code><code>insert</code> <code>into</code> <code>YOUYUS </code><code>values</code><code>(123);</code>
<code>1 row created.</code>
<code>SQL> </code><code>select</code> <code>dump(power(10,37),16) </code><code>from</code> <code>dual;</code>
<code>DUMP(POWER(10,37)</code>
<code>Typ=2 Len=2: d3,b</code>
<code>SQL> </code><code>insert</code> <code>into</code> <code>YOUYUS </code><code>values</code><code>(power(10,37));</code>
<code>SQL> </code><code>commit</code><code>;</code>
<code>Commit</code> <code>complete.</code>
<code>SQL> </code><code>alter</code> <code>system </code><code>checkpoint</code><code>;</code>
<code>System altered.</code>
<code>SQL> </code><code>select</code> <code>header_block ,header_file </code><code>from</code> <code>dba_segments </code><code>where</code> <code>segment_name=</code><code>'YOUYUS'</code><code>;</code>
<code>HEADER_BLOCK HEADER_FILE</code>
<code>------------ -----------</code>
<code>522 4</code>
<code>SQL> </code><code>alter</code> <code>system dump datafile 4 block 523;</code>
<code>block dump record:</code>
<code>tl: 7 fb: </code><code>--H-FL-- lb: 0x1 cc: 1</code>
<code>col 0: [ 3] c2 02 18</code>
<code>tab 0, row 1, @0x1f8b</code>
<code>tl: 6 fb: </code><code>--H-FL-- lb: 0x1 cc: 1</code>
<code>col 0: [ 2] d3 0b</code>
<code>/* 可以看到power(10,37)的确只占用了2个字节 * /</code>
Oracle存储数字类型的长度和数字的大小无关,而和数字字面值有关系,字面值越复杂空间占用往往越多:
<code>SQL> </code><code>select</code> <code>dump(power(10,38)+1,16) </code><code>from</code> <code>dual;</code>
<code>DUMP(POWER(10,38)+1,16)</code>
<code>--------------------------------------------------------</code>
<code>Typ=2 Len=21: d4,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2</code>
<code>SQL> </code><code>select</code> <code>dump(power(10,38)-1,16) </code><code>from</code> <code>dual;</code>
<code>DUMP(POWER(10,38)-1,16)</code>
<code>-------------------------------------------------------------------------</code>
<code>Typ=2 Len=20: d3,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64</code>
本文转自maclean_007 51CTO博客,原文链接:http://blog.51cto.com/maclean/1277554