這完全取決於正在使用的DBMS引擎。 SQL本身並沒有規定物理存儲的方式,只是邏輯上看它們的方式。
例如,您的DBMS可能會在最大大小的行中分配空間,再加上一些額外的字節來存儲長度。在這種情況下,varchar(10)
和varchar(1000)
之間會有很大的差異,因爲您會浪費相當多的每行空間。
或者,它可能爲varchar
數據使用緩衝池,並且只存儲行中的長度和緩衝池「起始地址」。在這種情況下,無論數據大小如何,每一行都會存儲相同大小的信息,但是會增加一個步驟來提取該列中的實際數據(在連接到緩衝池之後)。
您使用varchar
的原因恰恰就是它名爲varchar
的原因。它允許您存儲可變大小的數據元素。通常,char(10)
會爲您提供十個字符,無論如何,如果插入較短的內容,請用空格填充它。您可以在提取時刪除尾隨空格,但如果要存儲的數據實際上是"hello "
,和要保留的尾隨空格,那麼效果不佳。
一個體面的DBMS引擎可能決定取決於varchar
列的最大大小進行權衡。簡而言之,它可以將其直接存儲在行中,並佔用大小的額外字節。
更長varchar
列可以被「外包」給一個單獨的緩衝池,以確保行讀數保持有效的(至少在您需要的大varchar
列,反正)。
你需要做的是重新問你的具體DBMS的問題,以獲得更有針對性的答案。
或者,誠實地說,設計你的數據庫只存儲最大尺寸。如果你知道它是10,那麼varchar(1000)
是浪費。如果將來您需要放大色譜柱,即是該做的時間,而不是現在(見YAGNI)。
對於MySQL,您需要查看在線文檔的Chapter 14 Storage Engines
。它涵蓋了MySQL使用的各種存儲引擎(如InnoDB和MyISAM),並且看起來足夠深入,可以看到信息是如何物理存儲的。
例如,在MyISAM中,表中存在可變長度數據(包括varchar
)通常表示dynamic tables。這遵循了與上面提到的緩衝池概念大致類似的方案,其優點是可變大小的列浪費的空間更少,以及行可能變得分散的缺點。
其他存儲格式(折扣壓縮格式,因爲它只用於只讀表格)是static one,其中數據存儲在單個物理行中。
關於InnoDB物理結構的信息可以在here找到。根據您使用的是Antelope還是Barracuda文件格式,最終會出現「所有信息都是物理行」或「緩衝池」的情況,類似於MyISAM的動態和靜態區分。
可能取決於您正在使用的產品。請爲特定的RDBMS產品添加標籤。 – 2013-04-24 06:25:43
我使用的是MySQL,但paxdiablo的答案對我來說已經足夠了。無論如何,我已經添加了MySQL標籤 – firia2000 2013-04-25 02:45:25