2008-11-28 61 views
2

我正在使用MSSQL数据库,并希望创建只有4个可能值的列。有没有什么办法来定义一个2位列?我看到位数据类型,然后下一个最小的是tinyint,它是1个完整字节。多位数据库字段

如果没有这样的领域,我会很有兴趣找出为什么不。

谢谢。

+0

请编辑问题发布4个可能的值;这个问题有一个'代码味道' - 我们的程序员的直觉告诉我们,你可能会吠叫错误的树 – 2008-11-28 19:53:06

回答

2

我没有看到这样的领域的原因。

它绝对不能是空间 - 今天很便宜,除非有很多行,否则6位经济实际上可以忽略不计。但是在这种情况下,无论如何它都会占用很多空间,而每行额外的6位也不会有什么区别。

速度也不是一个有效的原因。这些位字段需要额外的操作来存储和检索,这使得整个过程比简单地处理整个字节慢得多。最后,如果是关于约束,那么你应该使用外键或用户定义的类型(尽管这需要.NET中的额外编码)。虽然我只是使用一个字节并在我的应用程序中实现约束。也许不那么好,但容易得多。

更新:虽然,是,“枚举”约束将在MSSQL中有用。但这与简单的2位字段有点不同。

3

您对于字段大小的关注是什么?实现字段域的方式应该使用外键约束(MSSQL应该有)。

+0

你可以继续说“MSSQL有”。当然它有外键约束。 – MusiGenesis 2008-11-28 18:53:32

1

所以你说我应该只有一个外键到另一个包含我的四个值的表?

我没有认真的关心它。我只是没有看到给一个只需要2位的东西提供一个完整的字节。对于为什么不存在可变比特长度字段的原因,我更加好奇。

1

我对这件事情与friol。

我会创建一个查找表,其中包含您的四个可能的值,然后通过外键链接到它们。

至于数据类型,smallint与您将要获得的一样小,SQL Server实际上并不是用来保存各个数据位并对其进行操作,但可以通过二进制列中的按位运算符完成,但即使其中最小的那个在磁盘上也要大得多。 SQL Server位列也是不寻常的,因为它有3个潜在的值(1,0和null)。

+0

TinyInt只有一个字节,位只有一位... Albiet你仍然占据了表中定义的第一个八位列的磁盘存储的整个购买... – 2008-11-28 19:50:21

1

没有换汤不换药什么其他嘉宾纷纷表示,如果你仍然想这样做,有没有直接的方法......但是你可以使用两个栏位,

,然后添加生成计算列值(0-3)对应于2位列的值....

CREATE TABLE [dbo].[testTable](
    [colA] [bit] NOT NULL, 
    [colB] [bit] NOT NULL, 
    [CalcCol] AS (case [colA] when (1) then (2) else (0) end+[colB]) 
) ON [PRIMARY] 

,如果你需要一组不同的四个值的0-3,然后只把它们放进计算公式:

CREATE TABLE [dbo].[testTable](
    [colA] [bit] NOT NULL, 
    [colB] [bit] NOT NULL, 
    [CalcCol] As 
     (Case ColA 
      When 0 Then Case ColB WHen 0 Then ValueA Else ValueB End 
        Else Case ColB WHen 0 Then ValueC Else ValueD End 
      End) 
) ON [PRIMARY] 

唯一的问题是,计算列不能直接“写” - 你” d具有除非你的数据库被存储在软盘上写的代码分离的单个位域...像

Update TestTable Set 
    colA = Case When Value In (ValueA, ValueB) Then 0 Else 1 End, 
    colB = Case When Value In (ValueA, ValueC) Then 0 Else 1 End 
Where ... 
+0

那里不错,根据上面的注释,如果我是正确的(每行最少2比特列= 1字节),则每行使用1个字节,并且计算出的项目在飞行中正确完成? – 2008-11-28 20:56:25

0

,我不会出汗。接受其余的建议,继续构建数据库的其余部分。