2016-12-07 72 views
2

我將一張表導入到我的MS SQL數據庫中。該表格非常大,幾乎完全填滿了數據庫。我使用的導入工具將我的數字列保存爲varchar(50),但我希望它們是整數。因此,我將列更改爲int爲什麼將varchar(50)中的列改爲int需要更多空間

alter table <my_table> alter column <my_column> int 

據我所知,int列應該花費更少的磁盤空間,但上的可用空間不足的錯誤上面的查詢失敗。

是什麼原因導致此問題,並且是否有任何可能的解決方法?

+0

你是什麼意思?一個'INT'上升到2^31-1(2,147,483,647),'VARCHAR(50)'可以上升到'''99999999999999999999999999999999999999999999999999'' – Lamak

+1

我覺得在引擎蓋下它會是添加另一列,填充它,然後在最後做一個switcheroo。你能不能提供更多的空間,即使是暫時的? –

+0

_「是否有任何可能的解決方法」_ - 清理硬盤。 –

回答

4

整數列使用4個字節。

基於該documentation,varchar列的大小很容易地計算:

存儲大小爲輸入+ 2個字節的數據的實際長度。 varchar的ISO同義詞是charvarying或charactervarying。

因此,如果您的列主要由單個數字組成,那麼它只使用3個字節。 NULL值甚至使用較少的值(我認爲只是兩個長度字節)。當然,這表明您可以使用smallinttinyint,節省更多空間。

+0

謝謝,我的列大多是NULL,但可能包含大於'smallint'的值,所以您的答案似乎清除了問題。你認爲在計算時離開'varchar'並使用'cast'是個好主意嗎? – pajonk

+0

@pajonk。 。 。一般來說,一個字節在這裏或那裏沒有什麼大不了的。如果你有一百萬行,那麼你只談論幾兆字節的附加存儲。我應該說:*有時候*它確實有所作爲,但通常這種優化不是必需的。 –

相關問題