我需要存储Medicare APC codes.我相信格式需要4个数字。前导零是相关的。有没有办法通过验证存储此数据类型?我该如何存储这些数据(varchar(4),int)?
答案 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的输出。
答案 6 :(得分:0)
CHAR(4)
似乎更适合我(如果我理解你的话,代码总是4位数)。
答案 7 :(得分:0)
您要使用的是具有CHECK约束的VARCHAR数据类型,使用带有模式的LIKE来检查数值。
答案 8 :(得分:0)
check( isnumeric(APC_ODE) = 1)