SQL - 带前导零的数字数据类型

时间:2011-08-26 15:40:41

标签: sql

我需要存储Medicare APC codes.我相信格式需要4个数字。前导零是相关的。有没有办法通过验证存储此数据类型?我该如何存储这些数据(varchar(4),int)?

9 个答案:

答案 0 :(得分:4)

这种问题,在某些情况下(即排序)存储需要被视为数值的零前导数字,以及在其他情况下(即地址)存储的文本值总是很痛苦,并且没有一个答案是最好的适用于所有用户。在我的公司,我们有一个数据库,存储数字作为代码的文本(不是Medicare APC代码),我们必须用零填充它们,以便在订单操作中使用时它们会正确排序。

请勿对此使用数字数据类型,因为该项目不是真正的数字,而是使用数字字符的文本数据。您将不会对代码执行任何计算或聚合,因此将它们存储为数字的唯一好处是确保代码的正确排序,并且可以通过在需要时用零填充代码来存储为文本的代码。 。如果您使用数字数据类型,那么只要代码与其他文本值组合,您就必须将其显式转换为CHAR / VARCHAR或让SQL Server执行此操作,因为应始终避免隐式转换,这意味着需要进行大量额外工作。您和查询处理器在任何时候使用代码。

假设您决定使用文本数据类型,则问题是您应该使用VARCHAR还是CHAR,而许多已发布的人说VARCHAR我会建议您将CHAR设置为4的长度。为什么?

VARCHAR数据类型用于文本数据,其中大小(字符的长度或数量)是预先未知的。对于此Medicare代码,我们知道在可预见的未来,长度始终至少为4,可能不超过4。 SQL Server以不同的方式处理CHAR和VARCHAR之间的数据存储。 SQL Server的BOL(Books On Line)说:

当列数据条目的大小一致时使用CHAR

当列数据的大小变化很大时使用VARCHAR。

我不能肯定地说这对于SQL Server 2008及以上版本是正确的,但对于早期版本,使用VARCHAR数据类型会在表中具有每列1字节的额外开销。 VARCHAR数据类型。如果存储的数据总是相同的大小,并且在您的场景中听起来就像是这个额外的字节是浪费。

最后,您是否更喜欢CHAR或VARCHAR,但绝对不使用数字数据类型来存储固定长度的代码。

答案 1 :(得分:3)

我同意,使用

CHAR(4)

用于检查约束使用

check( APC_ODE LIKE '[0-9][0-9][0-9][0-9]' )

这将强制接受一个4位数字......

答案 2 :(得分:2)

这不是数字数据;它的文本数据恰好包含数字。

使用VARCHAR

答案 3 :(得分:2)

varchar(4)

可选地,您仍然可以添加检查约束以确保数据为带前导零的数字。此示例将在Oracle中引发异常。在其他RDBMS中,您可以使用正则表达式检查:

alter table X add constraint C 
check (cast(APC_CODE as int) = cast(APC_CODE as int))

答案 4 :(得分:1)

如果您确定APC代码将始终为数字(即如果它在不久的将来不会更改),更好的方法是保持数据库列不变,并处理格式化(包括在使用此字段值的位置处前导零。

答案 5 :(得分:0)

如果您需要前导0,则必须使用varchar或其他字符串数据类型。

有一些方法可以在不影响实际数据的情况下格式化前导0的输出。

See this blog entry for an easy method.

答案 6 :(得分:0)

CHAR(4)似乎更适合我(如果我理解你的话,代码总是4位数)。

答案 7 :(得分:0)

您要使用的是具有CHECK约束的VARCHAR数据类型,使用带有模式的LIKE来检查数值。

答案 8 :(得分:0)

在TSQL中

check( isnumeric(APC_ODE) = 1)