2010-10-29 88 views
1

我认为标题说明了一切。 将8位无符号数字存储为Int或char(8)类型会更好吗(更快,节省空间(根据内存和磁盘)? 当我使用固定的字符长度时,如果将来数字将变为9位数,我会不会遇到麻烦?SQL Server数据类型:将8位无符号数存储为INT或CHAR(8)?

背景-信息:我想存储TAC小号

感谢

+0

空间是毫不费力的 - 8位数字将适合4个字节,因此SQL INTEGER足够存储。 – StuartLC 2010-10-29 09:38:49

+0

TAC不是数字。它是数字标识符(字符串)。 – TomTom 2010-10-29 09:51:07

+0

TAC不是数字。这是一个自由的人! – Jay 2010-10-29 21:14:52

回答

2

如果是一个数字,将其存储为一个数字。

整数使用4 bytes存储,给他们的范围内:

-2^31(2,147,483,648)至2^31-1(2,147,483,647)

所以,适合您的需要。

char[8]将存储为8 bytes,所以双倍的存储,当然从需要在未来扩大遭受(转换为8至9个字符几乎10M记录将需要时间,可能会需要对数据库脱机的持续时间)。因此,从存储,速度,内存和磁盘使用(所有与数据类型使用的字节数有关),可读性,语义和未来打样,int胜过所有。


更新

现在你已经澄清,你是不是存储数字,我会说,你将不得不使用char为了保留前导零。

至于未来扩展的问题 - 因为char是固定长度字段,从char[8]更改为char[9]不会丢失信息。但是,我不确定是否会在右侧或左侧添加其他字符(尽管可能未确定)。您必须进行测试,并且一旦该字段已扩展,您将需要确保原始数据已保存。

一个更好的办法可能是创建一个新的char[9]场,所有char[8]数据迁移到它(让事情变得可靠和一致的),然后取出char[8]场和新场重命名为原来的名称。当然,这会破坏桌子上的所有统计数据(但是直接扩展字段也是如此)。

1

棒为INT为这一个,DEFFINITELY INT(OR BIGINT)

看一看int, bigint, smallint, and tinyint (Transact-SQL)

从-2^31 (-2,147,483,648)到2^31 - 1 0的整数(整数)数据(2,147,483,647)。存储大小为4个字节 ,从-2^63 (-9,223,372,036,854,775,808)通过 2^63-1(9,223,372,036,854,775,807)

BIGINT(整数)的数据。 存储大小是8个字节。

相比

char and varchar

固定长度非Unicode字符 数据具有n个字节的长度。 n必须是 从1到8,000的值。存储 大小为n个字节。

而且,一旦你对查询这个,你将不得不降低性能,如果您使用整数相比,你char列,如SQL Server将不得不做铸你...

+0

我补充说,我需要它来存储TAC是唯一的数字标识符。其他人提到,由于前导零,字符会更好。不管怎么说,还是要谢谢你。确切地说, – 2010-10-29 10:12:21

4

鉴于TAC可以具有前导零,它们实际上是一个不透明的标识符,并且从不计算,使用char列。

在确定已正确建模数据类型之前,不要开始对空间进行优化。

编辑

但为了避免在那里得到的垃圾,确保应用CHECK约束也。 E.g如果它的意思是8位数字,加

CONSTRAINT CK_Only8Digits CHECK (not TAC like '%[^0-9]%' and LEN(RTRIM(TAC)) = 8) 
+0

。这不是NU NUMBER,它是一个数字标识符。你永远不会做数学,但你可能想要查找以特定数字结尾或包含某些数字的所有数字。根据定义不是数字。 – TomTom 2010-10-29 09:50:05

+0

谢谢澄清。我会在后端添加前导零,但我认为这可能会导致更多的问题,而不是保持原样。Char(10)在这种情况下是最好的,不是吗?因为将来可能会改变数字的数量。 – 2010-10-29 10:08:41

+0

@Tim Schmelter - 我对这个特定领域并不熟悉 - 目前正在讨论这种变化,还是因为N年(N与系统的预计寿命相比较而言较小)?如果是,那么是的,我可能会制作一个更宽的专栏。 – 2010-10-29 10:12:22

2

的int将使用较少的内存空间,并给予更快的索引比一个字符。

如果你需要分开这些数字 - 搜索数字3-4是“02”或一些这样的一切 - 字符会更简单,可能更快。

我收集你没有对他们做算术。您不会将两个TAC添加到一起,或者找到一组记录或类似的任何记录的平均TAC。如果你是这样的话,那将是使用int的一个满贯的解释。

如果它们具有前导零,则它可能更易于使用char,因此您不必始终用零填充正确长度的数字。

如果以上都不适用,则无关紧要。我可能会使用char。我无法想出任何一种令人信服的理由。

相关问题