天天看点

有趣的数字记录方式

<a href="http://blog.51cto.com/maclean/1277554#">?</a>

<code>SQL&gt; </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&gt; </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&gt; </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&gt; </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&gt; </code><code>create</code> <code>table</code> <code>YOUYUS (t1 number(38,0)) tablespace users;</code>

<code>Table</code> <code>created.</code>

<code>SQL&gt; </code><code>insert</code> <code>into</code> <code>YOUYUS </code><code>values</code><code>(123);</code>

<code>1 row created.</code>

<code>SQL&gt; </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&gt; </code><code>insert</code> <code>into</code> <code>YOUYUS </code><code>values</code><code>(power(10,37));</code>

<code>SQL&gt; </code><code>commit</code><code>;</code>

<code>Commit</code> <code>complete.</code>

<code>SQL&gt; </code><code>alter</code> <code>system </code><code>checkpoint</code><code>;</code>

<code>System altered.</code>

<code>SQL&gt; </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&gt; </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&gt; </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&gt; </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