对于 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 转换为 datedatetime 列时。

【讨论】:

是的,您可以通过三种方式使用这样的 ID。 1)假设你得到的每一个身份证都是好的。 2)假设您获得的每个 id 都可能是错误的,并验证校验和。 3)假设您获得的每个 id 都可能是错误的,并验证组件。如果我有自己的选择,我从不认为每个 id 都是好的。我至少会验证校验和。【参考方案3】:

我确实会使用VARCHAR 和匹配格式的CHECK。如果有内部验证,你甚至可以更复杂,例如一个校验位。现在您已准备好使用其他具有字母字符的国家/地区,或者您是否需要处理前导零。

我不会使用整数,除非在字段上进行某种算术运算有意义,这在这里几乎肯定不是真的。

【讨论】:

从不,永远将数字存储在 varchar 列中。甚至没有控制格式的检查约束。 @a_horse_with_no_name,您愿意提供一个理由吗?除了几个字节,你在这里使用数字获得吗? ID 并不是真正的“数字”,您不需要添加或平均它,它是一个只有数字的字符串。而且很有可能仍然需要验证。 在字符列中存储数字时会出现很多问题。想到排序(10 将在 2 之前排序)您无法使用 <> 可靠地比较它们(甚至 = - 想想 0011)。您会发现自己来回转换字符值。如果没有检查约束,无论如何这将成为一场绝对的噩梦。 如果这是一个“代码”而不是数字 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个字吗

SQL server 2008实例配置

SQL Server2008 错误源:.net SqlClient data provider的解决方法

如何在 SQL Server 2008 中删除区分大小写的检查?