2016-04-14 49 views
0

比方說,比如我創建一個表像一些列:爲什麼需要在oracle(或任何其他數據庫)中定義數據類型的大小?

COLUMN_NAME DATA_TYPE   NULLABLE and ....... 
=========== =========   ======== ============================ 
NAME   VARCHAR2(100 BYTE) No 
GENDER  VARCHAR2(1 BYTE)  No 

在創建我需要定義的數據大小列NAME (100 BYTE)GENDER (1 BYTE)表。 有人可以解釋這到底是什麼目的嗎?

對於NAME列,我分配了100 BYTE。但有時名稱值可能不會佔用100 BYTE。所以它浪費了一些空間,對吧?爲什麼數據庫本身不能自動管理它?

+0

'varchar'是一個可變長度的數據類型。在varchar(100)列中只存儲1個字符時不會浪費空間。 –

+0

@a_horse_with_no_name謝謝,但是我可能知道定義變長的目的嗎? –

+3

這是一個商業約束。你聲明你不想存儲更長的值(在Postgres中,你不需要指定最大長度)。您可能想閱讀:http://stackoverflow.com/q/8295131/330315和Oracle概念指南:http://docs.oracle.com/database/121/CNCPT/tablecls.htm#GUID-5D05C023- C309-46DA-A7EC-2BED1CA512A7 –

回答

2

varchar2參數定義允許存儲在列中的最大字符數。這與每行分配的實際存儲空間很少有關。只要實際存儲的值適合,數據庫就可以儘可能少地使用它。

然而,數據庫通常會在存儲行時爲每個塊添加一些邊距/額外空間,以便在值更改時允許增長。它使用多少取決於PCTFREE表格設置。

即使剩餘的空間不足,仍然可以存儲該值。數據庫將只需在同一個存儲盒(稱爲塊)內推送其他數據。如果該框變滿,則必須分配另一個塊並將數據分配到這些塊上。這導致了對性能有負面影響的碎片化。

回到原來的存儲限制,它指出了此列中每行的最大存儲限制。它可能不會超過這個數量。而且限制可能設置的限制有多大。對於varchar2,大多數Oracle版本都是4K。可能是因爲大多數平臺上的默認塊大小都是4K。

相關問題