2016-12-07 70 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。 。 。一般来说,一个字节在这里或那里没有什么大不了的。如果你有一百万行,那么你只谈论几兆字节的附加存储。我应该说:*有时候*它确实有所作为,但通常这种优化不是必需的。 –

相关问题