【发布时间】:2011-03-09 10:59:16
【问题描述】:
Microsoft SQL Server 中是否有类似 MySQL 的布尔数据类型?
如果没有,MS SQL Server 中的替代方案是什么?
【问题讨论】:
-
其实MySQL没有
boolean数据类型。
标签: sql-server types boolean
Microsoft SQL Server 中是否有类似 MySQL 的布尔数据类型?
如果没有,MS SQL Server 中的替代方案是什么?
【问题讨论】:
boolean数据类型。
标签: sql-server types boolean
SQL Server 使用 Bit 数据类型
【讨论】:
您可以在 SQL Server 中使用Bit DataType 来存储布尔数据。
【讨论】:
您可以使用BIT 数据类型来表示布尔数据。 BIT 字段的值为 1、0 或 null。
【讨论】:
BIT 不等于布尔值。如果一个标量函数返回一个bit,你仍然需要测试它是0还是1。例如dbo.IsReturnsBit(value) = 1
使用Bit 数据类型。在原生 T-SQL 中处理时,它的值为 1 和 0
【讨论】:
您可能想使用BIT 数据类型,可能设置为NOT NULL:
引用MSDN article:
位 (Transact-SQL)
整数数据类型,可以取值 1、0 或 NULL。
SQL Server 数据库引擎优化了位列的存储。如果表中有 8 个或更少的位列,则这些列存储为 1 个字节。如果有 9 到 16 位列,则这些列存储为 2 个字节,依此类推。
字符串值 TRUE 和 FALSE 可以转换为位值:TRUE 转换为 1,FALSE 转换为 0。
【讨论】:
bit。它存储 1 或 0(或 NULL)。或者,您可以使用字符串 'true' 和 'false' 代替 1 或 0,就像这样-
declare @b1 bit = 'false'
print @b1 --prints 0
declare @b2 bit = 'true'
print @b2 --prints 1
此外,任何非 0 值(正或负)的计算结果为(或在某些情况下转换为)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 数据类型的一个可能值。以下是相关的真值表 -
更多关于三值逻辑的信息-
Example of three valued logic in 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/
【讨论】:
true 和 false 不是非零值吗?
SQL Server 中有布尔数据类型。它的值可以是TRUE、FALSE 或UNKNOWN。然而,布尔数据类型只是包含comparison operators(例如=、<>、<、>=)或logical operators(例如AND、@ 987654337@、IN、EXISTS)。布尔表达式只允许在少数地方使用,包括WHERE 子句、HAVING 子句、CASE expression 的WHEN 子句或IF 或WHILE 流控制语句的谓词。
对于所有其他用途,包括表中列的数据类型,不允许使用布尔值。对于其他用途,首选 BIT 数据类型。它的行为类似于缩小的INTEGER,它只允许值0、1 和NULL,除非进一步受到NOT NULL 列约束或CHECK 约束的限制。
要在布尔表达式中使用BIT 列,需要使用比较运算符(例如=、<> 或IS NULL)对其进行比较。例如
SELECT
a.answer_body
FROM answers AS a
WHERE a.is_accepted = 0;
从格式化的角度来看,bit 值通常在客户端软件中显示为 0 或 1。当需要更用户友好的格式,并且无法在数据库前面的应用层处理时,可以使用 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 约束以限制非法值.
作为参考,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
)
【讨论】: