我觉得标题说明了一切。将8位无符号数字存储为Int或char(8)类型更好(速度更快,根据内存和磁盘节省空间)?当我以后使用固定字符长度时,当数字变成9位数时,我会遇到麻烦吗?
背景信息:我想存储TAC%s
谢谢
发布于 2010-10-29 17:40:21
如果是数字,则将其存储为数字。
整数使用4 bytes存储,给出了它们的范围:
-2^31 (-2,147,483,648)到2^31-1 (2,147,483,647)
因此,适合您的需求。
char[8]将存储为8 bytes,因此存储空间翻了一番,当然,将来还需要扩展(将近1000万条记录从8个字符转换为9个字符需要时间,并且可能需要在此期间使数据库脱机)。
因此,从存储、速度、内存和磁盘使用(所有这些都与数据类型使用的字节数有关)、可读性、语义和未来校对方面,int轻松取胜。
更新
既然你已经澄清了你是在而不是存储数字,我想说的是你将不得不使用char来保存前导零。
至于未来扩展的问题-由于char是固定长度的字段,从char[8]更改为char[9]不会丢失信息。但是,我不确定是否会在右侧或左侧添加额外的字符(尽管这可能是未知的)。您将必须进行测试,一旦字段扩展,您将需要确保原始数据已被保留。
一种更好的方法可能是创建一个新的char[9]字段,将所有char[8]数据迁移到其中(以保持可靠和一致),然后删除char[8]字段并将新字段重命名为原始名称。当然,这会破坏表上的所有统计信息(但也会直接扩展字段)。
发布于 2010-10-29 17:46:59
鉴于TAC可以具有前导零,并且它们实际上是一个不透明的标识符,并且永远不会使用计算,因此请使用char列。
在确定数据类型建模正确之前,不要开始优化空间。
编辑
但为了避免垃圾,请确保您还应用了CHECK约束。例如,如果是8位数字,则添加
CONSTRAINT CK_Only8Digits CHECK (not TAC like '%[^0-9]%' and LEN(RTRIM(TAC)) = 8)发布于 2010-10-30 05:19:24
int比char占用更少的内存空间并提供更快的索引。
如果您需要拆分这些数字--搜索数字3-4是"02“或类似数字的所有内容-- char会更简单,也可能更快。
我猜你没有在他们身上做算术。您不需要将两个TAC相加在一起,也不需要计算一组记录的平均TAC或类似的东西。如果你是,这将是一个使用int的扣篮论点。
如果它们有前导零,那么使用char可能更容易,这样你就不必总是用零填充数字到正确的长度。
如果以上这些都不适用,那就没什么关系了。我可能会用char。我想不出一个令人信服的理由去走这两条路。
https://stackoverflow.com/questions/4050647
复制相似问题