我正在使用 MSSQL 数据库并想创建一个只有 4 个可能值的列。有没有办法定义一个 2 位列?我看到了 bit 数据类型,然后下一个最小的是 tinyint,它是 1 个完整字节。
如果没有这样的领域,我会很乐意找出原因。
谢谢。
我正在使用 MSSQL 数据库并想创建一个只有 4 个可能值的列。有没有办法定义一个 2 位列?我看到了 bit 数据类型,然后下一个最小的是 tinyint,它是 1 个完整字节。
如果没有这样的领域,我会很乐意找出原因。
谢谢。
您对字段大小有什么顾虑?实现字段域的方法应该是使用外键约束(MSSQL 应该有)。
我看不出这样一个领域的原因。
它绝对不能是空间——今天很便宜,除非你有很多行,否则 6 位的经济性真的可以忽略不计。但在那种情况下,无论如何它都会占用很多空间,而且每行额外的 6 位也几乎没有什么区别。
速度也不是正当理由。这样的位字段需要额外的操作来存储和检索,使得整个过程比简单地处理整个字节要慢得多。
最后,如果它是关于约束的,那么您应该使用外键或用户定义的类型(尽管这需要在 .NET 中进行额外的编码)。虽然我只是使用一个字节并在我的应用程序中实现约束。也许不是那么好,但要容易得多。
更新:虽然,是的,“枚举”约束在 MSSQL 中会很有用。但这又与简单的 2 位字段有点不同。
所以你是说我应该只有一个包含我的四个值的另一个表的外键?
我对此没有严重的担忧。我只是看不到给只需要 2 位的东西一个完整字节的意义。我对可变位长字段不存在的原因更加好奇。
我同意这点。
我将创建一个包含四个可能值的查找表,然后通过外键链接到它们。
至于数据类型,smallint 和你想得到的一样小,SQL Server 的设计并不是为了保存单个数据位并对其进行操作,但它可以通过二进制列中的位运算符来完成,但即使是最小的其中在磁盘上要大得多。SQL Server Bit 列也很不寻常,因为它有 3 个潜在值(1、0 和 null)。
不重复其他先生所说的,如果你仍然想这样做,没有直接的方法......但是你可以使用两个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 ...
除非您的数据库存储在软盘上,否则我不会出汗。在这里听取其他人的建议,然后继续构建数据库的其余部分。