对于 SQL Server 2008 中长度为 13 位的 ID 号,我可以使用哪种数据类型?
Posted
技术标签:
【中文标题】对于 SQL Server 2008 中长度为 13 位的 ID 号,我可以使用哪种数据类型?【英文标题】:What data type could I use for an ID number that has a length of 13 digits in SQL Server 2008? 【发布时间】:2013-05-06 17:14:54 【问题描述】:通常,INTEGER 数据类型就足够了,但是在南非,ID 号的长度为 13,而 INTEGER 数据类型最多只能达到 10。我不喜欢使用像 VARCHAR 这样的字符,因为它不会限制仅将输入 ID 号转换为整数值。我看到的唯一解决方案(除了使用 VARCHAR)是使用 DECIMAL。我看到的唯一问题是我不能像在 VARCHAR 中那样限制最大大小,并且数据输入可能有“,”和“。”有cmets吗?
【问题讨论】:
它们的固定长度是13还是13仅仅是最大长度? 【参考方案1】:只需使用 BIGINT,它的范围从 -9223372036854775808 到 9223372036854775807 应该足以满足您的应用程序。
【讨论】:
【参考方案2】:假设您指的是南非国民身份证号码,according to Wikipedia 总是有 13 位数字,那么我会选择带有 CHECK
约束的 CHAR(13)
(CLR user-defined data type 也可能是一个选项)。
主要原因是“数字”不是数字,而是 ID。您不能对这些值进行加、减、乘等操作,因此使用数字数据类型没有任何好处。此外,ID 由具有各自含义的组件组成,因此能够将它们解析出来可能很重要(并且在使用字符数据类型时更容易)。
事实上,根据您使用这些数据的方式,您还可以添加存储 ID 的各个组成部分(出生日期、序列、公民身份)的列,作为计算列或实际列。这对于查询和报告(和索引)可能很方便,尤其是当您将 DOB 转换为 date
或 datetime
列时。
【讨论】:
是的,您可以通过三种方式使用这样的 ID。 1)假设你得到的每一个身份证都是好的。 2)假设您获得的每个 id 都可能是错误的,并验证校验和。 3)假设您获得的每个 id 都可能是错误的,并验证组件。如果我有自己的选择,我从不认为每个 id 都是好的。我至少会验证校验和。【参考方案3】:我确实会使用VARCHAR
和匹配格式的CHECK
。如果有内部验证,你甚至可以更复杂,例如一个校验位。现在您已准备好使用其他具有字母字符的国家/地区,或者您是否需要处理前导零。
我不会使用整数,除非在字段上进行某种算术运算有意义,这在这里几乎肯定不是真的。
【讨论】:
从不,永远将数字存储在 varchar 列中。甚至没有控制格式的检查约束。 @a_horse_with_no_name,您愿意提供一个理由吗?除了几个字节,你在这里使用数字获得吗? ID 并不是真正的“数字”,您不需要添加或平均它,它是一个只有数字的字符串。而且很有可能仍然需要验证。 在字符列中存储数字时会出现很多问题。想到排序(10 将在 2 之前排序)您无法使用<
或 >
可靠地比较它们(甚至 =
- 想想 001
与 1
)。您会发现自己来回转换字符值。如果没有检查约束,无论如何这将成为一场绝对的噩梦。 如果这是一个“代码”而不是数字 ID,那么使用 varchar 可能有意义,但我们不知道我是否同意你的观点。
这与zip codes一起出现。
邮政编码不是“数字”,绝对应该存储在 varchar 列中。【参考方案4】:
您也可以使用money,尽管看起来您只能得到小数点后 4 位数字。 money
类型为 8 个字节,范围从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807。
declare @num as money
select @num = '1,300,000.45'
select @num
结果:
1300000.45
逗号和句点的解析可能取决于您的特定文化设置,尽管我不确定。
【讨论】:
金钱似乎是一种存储身份证号码的低效方式。以上是关于对于 SQL Server 2008 中长度为 13 位的 ID 号,我可以使用哪种数据类型?的主要内容,如果未能解决你的问题,请参考以下文章
sqlserver2008数据库中,我想设置varchar字段的长度为20000,要怎么做
sql server 2008环境中,字段为decimal(18,2),当输入为空时,会报错。
SQL server中的nvarchar最大的长度是4000个字吗