【问题标题】:Is there a Boolean data type in Microsoft SQL Server like there is in MySQL? [duplicate]Microsoft SQL Server 中是否有类似 MySQL 的布尔数据类型? [复制]
【发布时间】:2011-03-09 10:59:16
【问题描述】:

Microsoft SQL Server 中是否有类似 MySQL 的布尔数据类型?

如果没有,MS SQL Server 中的替代方案是什么?

【问题讨论】:

  • 其实MySQL没有boolean数据类型。

标签: sql-server types boolean


【解决方案1】:

SQL Server 使用 Bit 数据类型

【讨论】:

    【解决方案2】:

    您可以在 SQL Server 中使用Bit DataType 来存储布尔数据。

    【讨论】:

      【解决方案3】:

      您可以使用BIT 数据类型来表示布尔数据。 BIT 字段的值为 1、0 或 null。

      【讨论】:

      • 此外,标准做法是 0 被解释为 FALSE,1 被解释为 TRUE,并且 Nulls 在允许时将被反映为 NULL。
      • 请注意BIT 不等于布尔值。如果一个标量函数返回一个bit,你仍然需要测试它是0还是1。例如dbo.IsReturnsBit(value) = 1
      • 唯一的缺点是它不是特别用户友好。例如,我正在显示一个 sql 表的数据网格,我希望用户能够查看/编辑 true 或 false,而不是 1 或 0。
      • @crclayton 您可以有一个关联计算列,该列对 1 返回 true,对 false 返回 0。其他选项是对报告使用转换。当然,这是假设您看到此内容的典型用户不是习惯于 0/1 系统的程序员。
      【解决方案4】:

      使用Bit 数据类型。在原生 T-SQL 中处理时,它的值为 1 和 0

      【讨论】:

        【解决方案5】:

        您可能想使用BIT 数据类型,可能设置为NOT NULL

        引用MSDN article

        位 (Transact-SQL)

        整数数据类型,可以取值 1、0 或 NULL。

        SQL Server 数据库引擎优化了位列的存储。如果表中有 8 个或更少的位列,则这些列存储为 1 个字节。如果有 9 到 16 位列,则这些列存储为 2 个字节,依此类推。

        字符串值 TRUE 和 FALSE 可以转换为位值:TRUE 转换为 1,FALSE 转换为 0。

        【讨论】:

          【解决方案6】:

          您正在寻找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 使用三值逻辑(truefalseNULL),因为 NULLbit 数据类型的一个可能值。以下是相关的真值表 -

          更多关于三值逻辑的信息-

          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/

          【讨论】:

          • truefalse 不是非零值吗?
          • @Malachi 零被视为假,非零值被视为真。但 a true 的计算结果为 1,而 false 的计算结果为 0。例如,声明 @b bit = -9; if @b = 1 print 'pass' --注意位是如何设置为-9的,但隐式转换为1(which =“true”)并通过了if测试。
          • 值得注意的是,您会遇到使用此方法的额外开销,因为 SQL 会将您的“真”或“假”分别转换为 1 或 0。
          • @NathanielBendinsky 是的,如果涉及到任何演员阵容,将会产生开销(虽然不仅仅是在这种情况下......)。我只是想指出直接使用 True / False 是可能的。但是,是的,只使用 1 和 0 更有效。
          【解决方案7】:

          SQL Server 中有布尔数据类型。它的值可以是TRUEFALSEUNKNOWN。然而,布尔数据类型只是包含comparison operators(例如=<><>=)或logical operators(例如AND、@ 987654337@、INEXISTS)。布尔表达式只允许在少数地方使用,包括WHERE 子句、HAVING 子句、CASE expressionWHEN 子句或IFWHILE 流控制语句的谓词。

          对于所有其他用途,包括表中列的数据类型,不允许使用布尔值。对于其他用途,首选 BIT 数据类型。它的行为类似于缩小的INTEGER,它只允许值01NULL,除非进一步受到NOT NULL 列约束或CHECK 约束的限制。

          要在布尔表达式中使用BIT 列,需要使用比较运算符(例如=<>IS NULL)对其进行比较。例如

          SELECT
              a.answer_body
          FROM answers AS a
          WHERE a.is_accepted = 0;
          

          从格式化的角度来看,bit 值通常在客户端软件中显示为 01。当需要更用户友好的格式,并且无法在数据库前面的应用层处理时,可以使用 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)
          );
          

          【讨论】:

          • 位确实不是布尔等效项,因为您不能将布尔表达式分配给位列。真正的支持将处理将逻辑运算符直接分配给位字段,例如 x = y AND z。我最喜欢你的回答,因为你明确指出了这一点。
          【解决方案8】:

          我使用TINYINT(1)datatype 来在SQL Server 中存储布尔值,尽管BIT 非常有效

          【讨论】:

          • "BIT 很有效" -> 那么为什么要使用TINYINT(1) 呢?
          • TINYINT 仅存储 1 个字节,您可以在此处查看更多信息docs.microsoft.com/en-us/sql/t-sql/data-types/…
          • 但是 Bit 更好,因为 SQL 最多可以在一个字节中打包 8 个。
          • 我发现 TINYINT(1) 在 MySQL 上效果更好,因为 BIT 是 1 位或更多位的二进制位值,而不是序数,这就是为什么他们将 BOOL 作为 TINYINT 的别名(1)。对于 MS-SQL/TSQL BIT 通常没问题。如果他们费心将多个位连续打包,我会感到非常惊讶。
          • TINYINT 允许在 SQL Server 中使用 '+' 表示 OR 和 '*' 表示 AND,我想......有时会很有用。
          【解决方案9】:

          使用BIT 数据类型来表示布尔数据。 BIT 字段的值为 1,0 或 NULL。

          create table <tablename> (
              <columnName> bit
          )
          

          除非你想要一个三路布尔值,否则你应该像这样添加 NOT NULL DEFAULT 0:

          create table <tablename> (
              <columnName> bit not null default 0
          )
          

          【讨论】:

            猜你喜欢
            • 2018-06-07
            • 2010-09-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-08
            • 1970-01-01
            • 2016-04-20
            相关资源
            最近更新 更多