在Microsoft SQL Server中有布尔数据类型吗?
如果不是,在MS SQL Server的替代方案是什么?
SQL Server使用Bit数据类型
Bit
你可以在SQL Server中使用Bit DataType来存储布尔数据。
你可以使用BIT数据类型来表示布尔数据。BIT字段的值为1,0或null。
BIT
使用Bit数据类型。在本地T-SQL中处理它时,它的值为1和0
你可能想要使用BIT数据类型,可能设置为NOT NULL:
NOT NULL
引用MSDN文章:
位(transact - sql) 一种整数数据类型,其值可以为1、0或NULL。 SQL Server数据库引擎优化位列的存储。如果一个表中有8个或更少的位列,列存储为1字节。如果有9到16位的列,列存储为2字节,依此类推。 字符串值TRUE和FALSE可以转换为位值:TRUE转换为1,FALSE转换为0。
位(transact - sql)
一种整数数据类型,其值可以为1、0或NULL。
SQL Server数据库引擎优化位列的存储。如果一个表中有8个或更少的位列,列存储为1字节。如果有9到16位的列,列存储为2字节,依此类推。
字符串值TRUE和FALSE可以转换为位值:TRUE转换为1,FALSE转换为0。
bit
NULL
或者,你可以使用字符串'true'和'false'来代替1或0,就像这样-
'true'
'false'
declare @b1 bit = 'false' print @b1 --prints 0 declare @b2 bit = 'true' print @b2 --prints 1
此外,任何非0的值(无论是正的还是负的)计算为1(或在某些情况下转换为1)。
declare @i int = -42 print cast(@i as bit) --will print 1, because @i is not 0
注意,SQL Server使用三个值逻辑(true, false和NULL),因为NULL是bit数据类型的一个可能值。以下是相关的真值表
true
false
更多关于三值逻辑的信息
SQL Server中三值逻辑的示例
http://www.firstsql.com/idefend3.htm
https://www.simple-talk.com/sql/learn-sql-server/sql-and-the-snare-of-three-valued-logic/
SQL Server中存在布尔数据类型。取值为TRUE、FALSE或UNKNOWN。然而,布尔数据类型只是包含FALSE7(例如:=, <>, <, >=)或FALSE8(例如:AND, OR, IN, FALSE0)组合的布尔表达式的结果。布尔表达式只允许出现在少数几个地方,包括FALSE9子句、UNKNOWN0子句、UNKNOWN1的FALSE3子句或UNKNOWN2或UNKNOWN3流控制语句的谓词。
TRUE
FALSE
UNKNOWN
=
<>
<
>=
AND
OR
IN
对于所有其他用法,包括表中列的数据类型,不允许使用布尔值。对于那些其他用法,BIT数据类型是首选。它的行为类似于缩小后的INTEGER,只允许值0, 1和NULL,除非进一步使用NOT NULL列约束或CHECK约束进行限制。
INTEGER
0
1
CHECK
要在布尔表达式中使用BIT列,需要使用比较操作符进行比较,例如=, <>或IS NULL。如。
IS NULL
SELECT a.answer_body FROM answers AS a WHERE a.is_accepted = 0;
从格式化的角度来看,bit值通常在客户端软件中显示为0或1。当需要更用户友好的格式,并且它不能在数据库前的应用层处理时,可以使用CASE表达式“即时”转换它,例如。
CASE
SELECT a.answer_body, CASE a.is_accepted WHEN 1 THEN 'TRUE' ELSE 'FALSE' END AS is_accepted FROM answers AS a;
将布尔值存储为字符数据类型(如char(1)或varchar(5))也是可能的,但这不太清楚,有更多的存储/网络开销,并且需要对每列进行CHECK约束以限制非法值。
char(1)
varchar(5)
作为参考,answers表的模式类似于:
answers
CREATE TABLE answers ( ..., answer_body nvarchar(MAX) NOT NULL, is_accepted bit NOT NULL DEFAULT (0) );
我使用TINYINT(1)datatype来存储SQL Server中的布尔值,尽管BIT是非常有效的
TINYINT(1)
使用BIT数据类型来表示布尔数据。BIT字段的值是1,0或NULL。
create table <tablename> ( <columnName> bit )
除非你想要一个三路布尔值,你应该像这样添加NOT NULL DEFAULT 0:
create table <tablename> ( <columnName> bit not null default 0 )