从您的评论来看,如果您没有对其进行任何算术运算(即它只是一个标识符),它不必是 - 并且可能根本不应该是 - 首先是一个数字。只需将其视为数据库和消费应用程序中的字符串,然后继续。
但是,对于实际拥有number的问题的未来访问者,我可以想到两种选择:
- 使用
varchar
和BigInteger.Parse(string)
/BigInteger.ToString()
- 使用
varbinary
和BigInteger..ctor(byte[])
/BigInteger.ToByteArray()
采用二进制路线可能会带来性能或空间优势,但它也可能会限制需要使用该值的其他应用程序。恕我直言,除非您要每秒解析其中的许多内容,否则我怀疑这是否真的值得麻烦——而且这些天存储很便宜。
此外,如今字符串似乎是事实上的序列化方法(例如 XML 或 JSON),并且存储在 avarchar
中还可以让您直接使用 SQL Server 的 XML 功能。
但是,使用这些选项,您将需要在数据库之外进行算术和排序。如果这是需要排序/过滤/处理的数据,您可能需要重新考虑策略。(见@MikeB 的评论)
为了解决自然排序顺序问题(您仍然无法进行算术运算),您可以将字符串补零到固定长度。我的建议是使用持久计算列来填充零。如果您持久化列数据,您还可以在其上放置索引;只需确保在进行排序时对填充列进行排序。SQL Fiddle 演示
或者,最后一种选择是专门创建一个 CLR 类型来 wrap BigInteger
,因此您可以直接在 SQL Server 中使用它(即用于比较和算术)。同样,不确定是否值得麻烦,但如果您需要批量进行算术运算,这可能是最快的方法。