我应该使用哪种数据类型来存储 11 位数字

Las*_*ind 4 sql-server-2008 sql-server datatypes

我应该使用哪种数据类型来存储 11 位数字?它必须存储“0”作为第一个数字。

例如,如果我存储02421402015,它必须显示02421402015。我尝试使用varchar,它显示2421402015.

Han*_*non 14

我建议将数字存储为 a BIGINT,并按照您想要的方式简单地显示数字。

DECLARE @Num BIGINT;

SET @Num = 2421402015;

SELECT CONVERT(VARCHAR(11), REPLICATE('0', 11 - LEN(@Num))) 
    + CONVERT(VARCHAR(11), @Num);
Run Code Online (Sandbox Code Playgroud)

正如Aaron Bertrand在他的评论中指出的那样,不计算所需的零字符串的长度并简单地截断字符串在性能方面会更好:

SELECT RIGHT(REPLICATE('0', 11) + CONVERT(VARCHAR(11), @Num), 11);
Run Code Online (Sandbox Code Playgroud)

对于您的样本编号,串联将导致“000000000002421402015”,然后将其右截断为 11 位数字,结果为:

02421402015
Run Code Online (Sandbox Code Playgroud)

事实上,正如srutzky 所指出的,这可以进一步优化为:

SELECT RIGHT('00000000000' + CONVERT(VARCHAR(11), @Num), 11);
Run Code Online (Sandbox Code Playgroud)

如果用户将传入需要在WHERE子句中匹配的带前导零的值,我会先将搜索词转换为整数,然后在谓词中使用它,以便可以使用索引。

我写了一篇博客文章1,详细介绍了如何将数字存储为整数,同时提供一种优雅的方法,使数字看起来像是以前导零存储在数据库中。查看http://www.sqlserver.science/basics/how-do-i-store-a-number-with-leading-zeros/了解详情!还有其他几种格式化前导零列的方法,但是每种方法性能差异很大;该RIGHT('00000000000' + CONVERT(VARCHAR(11), @Num), 11)方法看起来是迄今为止最快的。


1 - 我的博客文章在SQL PASS 社区连接器新闻中有特色
2 -关于SQL Server 2012+ 中的功能性能的后续文章FORMATMESSAGE()


Aar*_*and 6

为了证明您在问题中所说的不正确:

DECLARE @x TABLE(y VARCHAR(11));

INSERT @x(y) VALUES('02421402015');

SELECT y FROM @x;
Run Code Online (Sandbox Code Playgroud)

结果:

y
-----------
02421402015
Run Code Online (Sandbox Code Playgroud)

您需要告诉我们更多有关正在发生的事情的详细信息,以便我们更好地了解您的问题。

但最重要的是,您需要考虑将存储与演示分开。将数字存储为int(4 个字节)或bigint(8 个字节)比varchar(11)(11 个字节 + 2 个字节表示长度)更有效,而且您还获得了内置验证(因此有人无法存储I'm varchar而不是数字)、算术等,而无需隐式或显式转换。0在您的表示层中添加显示前导是微不足道的,如果您确实需要,甚至可以在查询时添加到 SQL Server 中。在传入的搜索条件中添加或删除也是微不足道的,这样您就可以使用正确的参数类型搜索正确和最有效的数据类型,而不管用户认为他们正在搜索和看到什么......