2

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

如果没有这样的领域,我会很乐意找出原因。

谢谢。

4

6 回答 6

3

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

于 2008-11-28T18:36:06.993 回答
2

我看不出这样一个领域的原因。

它绝对不能是空间——今天很便宜,除非你有很多行,否则 6 位的经济性真的可以忽略不计。但在那种情况下,无论如何它都会占用很多空间,而且每行额外的 6 位也几乎没有什么区别。

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

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

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

于 2008-11-28T18:52:10.550 回答
1

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

我对此没有严重的担忧。我只是看不到给只需要 2 位的东西一个完整字节的意义。我对可变位长字段不存在的原因更加好奇。

于 2008-11-28T18:44:53.420 回答
1

我同意这点。

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

至于数据类型,smallint 和你想得到的一样小,SQL Server 的设计并不是为了保存单个数据位并对其进行操作,但它可以通过二进制列中的位运算符来完成,但即使是最小的其中在磁盘上要大得多。SQL Server Bit 列也很不寻常,因为它有 3 个潜在值(1、0 和 null)。

于 2008-11-28T18:47:54.257 回答
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 ... 
于 2008-11-28T19:49:13.243 回答
0

除非您的数据库存储在软盘上,否则我不会出汗。在这里听取其他人的建议,然后继续构建数据库的其余部分。

于 2008-11-28T20:00:52.143 回答