用什么类型来存储12位数值我应该在SQL DB中使用decimal还是nvarchar?

时间:2011-09-20 14:09:54

标签: c# asp.net sql

我需要在数据库中存储一个CARD ID号。因此,不计算只搜索ID并将Session中的值作为属性放在类中。

ID始终是数字,它是12个位置。 例如123456789012,我想以这种格式在屏幕上显示。 123.456.789.012(每3位数一个点)。

我尝试了一个测试并在数据库中定义了Decimal(12,0)并将此值放在数据库中:555666777888

然后我尝试在屏幕上显示我使用此代码(CardID是十进制):

  lblCardID.Text = ent.CardID.ToString("0:#,###")

但它在屏幕上显示如下: 555,666,77:7,888

冒号(:)来自哪里?

附加问题: - MS SQL中应使用哪种类型将此值存储在数据库中。十进制(12,0)或Nvarchar(12)?

8 个答案:

答案 0 :(得分:4)

绝对不需要{p> nvarchar。如果它总是12位数,char(12)就可以了,但我认为64位整数是最合适的。

答案 1 :(得分:3)

尝试写作

lblCardID.Text = ent.CardID.ToString("#,###")

您可以使用decimal(12,0)bigint数据类型。 bigint每个存储值需要少一个字节(总共8个字节)。

答案 2 :(得分:2)

冒号来自格式字符串中的冒号。使用string.Format()时,需要格式字符串开头的“0:”作为占位符来标识要格式化的参数,但是如果使用ToString()则不需要(因为只有一个价值被格式化。)

答案 3 :(得分:1)

我会使用bigint,因为每个值只需要8个字节。

decimal(12,0)需要9个字节,varcharnvarchar需要更多(存储12位数时分别为12或24个字节)。

较小的列大小使索引更小,这使得索引的使用更快。

格式化数字可以在应用程序中完成。 如果需求发生变化,在应用程序中更改格式也会容易得多。

答案 4 :(得分:0)

如果您需要存储格式,并且它只是一个数值,请使用varchar,不要浪费时间使用nvarchar,因为它会增加您的存储空间并且除非您期望特殊(国际)字符,否则对您没有任何好处

答案 5 :(得分:0)

如果永远不会计算,我会将其存储为char(12)。

然后在你的代码中,用这样的东西拆分它并使用replace函数将逗号转换为点:

lblCardID.Text = ent.CardID.ToString("#,###").Replace(",", ".")

答案 6 :(得分:0)

如果它是一个ID号将它存储为一个字符串数据类型,你就不会对它进行总结,你也不会有丢失任何前导零的问题。然后,您还可以使用嵌入的点存储卡ID,以解决格式问题。

答案 7 :(得分:0)

除了由数字组成之外,您的标识符域是否具有主题属性?如果没有,则您的值是固定宽度,因此请使用CHAR(12)。不要忘记添加适当的域检查(除了数字之外没有其他字符,没有前导零等),例如

CREATE TABLE Cards 
(
 card_ID CHAR(12) NOT NULL
    UNIQUE
    CONSTRAINT card_ID__all_digits 
       CHECK (card_ID NOT LIKE '%[^0-9]%'), 
    CONSTRAINT card_ID__no_leading_zero
       CHECK (card_ID NOT LIKE '[1-9]%)')
);