SQL:一个比特或一个字符(1)哪个更好

SQL:一个比特或一个字符(1)哪个更好,sql,sql-server,performance,sql-server-2008,Sql,Sql Server,Performance,Sql Server 2008,在检索位或字符(1)时是否有性能上的差异 只是出于好奇=] 更新:我正在使用SQL Server 2008 它取决于实现。一个DBMS可能具有相同的性能,而另一个DBMS可能具有不同的性能。对于SQL Server:一个字节中最多可以存储8列位类型的列,而字符(1)类型的每列将占用一个字节 另一方面:BIT列可以有两个值(0=false,1=true)或根本没有值(NULL)——而CHAR(1)可以有任何字符值(可能性更大) 因此,实际上,它归结为: 您真的需要真/假(是/否)字段吗?如果是:

在检索位或字符(1)时是否有性能上的差异

只是出于好奇=]


更新:我正在使用SQL Server 2008

它取决于实现。一个DBMS可能具有相同的性能,而另一个DBMS可能具有不同的性能。

对于SQL Server:一个字节中最多可以存储8列
位类型的列,而
字符(1)
类型的每列将占用一个字节

另一方面:
BIT
列可以有两个值(0=false,1=true)或根本没有值(NULL)——而
CHAR(1)
可以有任何字符值(可能性更大)

因此,实际上,它归结为:

  • 您真的需要真/假(是/否)字段吗?如果是:使用
    BIT
  • 您是否需要具有两个以上可能值的内容-使用
    CHAR(1)

从性能的角度来看,我不认为这有什么显著的区别,除非你有成千上万的专栏。当然,使用一个字节最多可存储8列的
位将是有益的。但同样:对于“正常”的数据库情况,您有几个、十几个这样的列,这并没有多大区别。选择适合您需要的列类型-不要过分担心性能….

正如Adam所说,这取决于数据库是否正确实现了数据类型,但在理论上,以下几点适用:

位:

将存储1、0或null。存储值只需要一点时间(根据定义!)。通常用于真或假,许多编程语言会自动将位解释为真或假字段

Char[1]:

一个字符需要8位,或者说一个字节,所以它在存储时要大8倍。你可以(几乎)在那里存储任何字符。可能会被编程语言解释为字符串。我认为Char[1]将始终使用完整字节,即使是空的,除非您使用varchar或nvarchar。

位和Char(1)都将使用1字节来存储,假设表中只有1位列,SQL Server将在1字节中存储8位列。我认为在表现上没有区别

需要注意的一件事是,不能对位列求和

CREATE TABLE #test( a BIT)

INSERT #test VALUES (1)
INSERT #test VALUES (1)

SELECT sum(a) FROM #test
Msg 8117,第16级,状态1,第1行
操作数数据类型位对于求和运算符无效

你必须先转换它

SELECT sum(CONVERT(INT,a)) FROM #test

用一点。始终使用尽可能最小的数据类型。一旦开始获取大型表,这一点就非常重要。

这取决于RDBMS是什么。并不是每个人都以相同的方式实现。例如,MySQL的位数据类型是假的。对于SQL Server,请参阅:@BoltClock-这肯定应该详细说明并给出答案。@Justin Niessner:Adam已经做了一些:)@BoltClock-详细信息。我首先看到了你的评论。哈哈,这不是问题的重点。。。我想知道这件事performance@Renanlf:答案在前两句中。@renanlf:尝试添加更多性能内容-但老实说:这是一个微小的微优化,我认为其他因素更重要-选择符合您需要的专栏!是的,我知道这是一个小小的优化。。。这就是为什么它只是出于好奇而去挖掘这篇老文章,即使是一个微观优化——检查和筛选新的专栏添加内容以提高性能总是很好的。即使有一点帮助。您也无法对字符(1)列进行求和,或者
CREATE TABLE#test(a char(1))INSERT#test VALUES(1)INSERT#test VALUES(1)SELECT sum(a)FROM#test
Msg 8117,Level 16,State 1,Line 1操作数数据类型char对于求和运算符无效。