多位数据库字段

时间:2008-11-28 18:33:05

标签: sql-server database field

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

如果没有这样的领域,我会很有兴趣找到原因。

感谢。

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

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

速度也不是正当理由。这样的位字段需要额外的操作才能存储和检索,这使得整个过程比简单地处理整个字节慢得多。

最后,如果它是关于约束的,那么你应该使用外键或用户定义的类型(尽管这需要在.NET中进行额外的编码)。虽然我只是使用一个字节并在我的应用程序中实现约束。也许不太好,但更容易了。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

我和弗里奥尔在一起。

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

至于数据类型,smallint就像你要获得的一样小,SQL Server实际上并不是设计用于保存单个数据位并操纵它们,但它可以通过二进制列中的Bitwise运算符完成,但是即使是最小的磁盘也要大得多。 SQL Server Bit列也很常见,因为它有3个潜在值(1,0和null)。

答案 4 :(得分:1)

没有重复其他绅士所说的话,如果你仍然想要这样做,那就没有直接的方法......但是你可以使用两个Bit列,

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

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]

唯一的问题是计算列不是直接“可写”的 - 你必须在单独的代码中写入各个位字段...比如

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 ... 

答案 5 :(得分:0)

除非您的数据库存储在软盘上,否则我不会感到厌烦。在这里接受其余部分的建议,继续构建数据库的其余部分。