SQL Server - BIT数据类型问题

Yas*_*uru 4 sql-server sqldatatypes

我的SQL Server 2012中有一个表如下,

CREATE TABLE TEST (ID INT,NAME VARCHAR(100),STATUS BIT);
Run Code Online (Sandbox Code Playgroud)

我错误地插入了这样的数据

INSERT INTO TEST SELECT 1,'A',2;
Run Code Online (Sandbox Code Playgroud)

当我查询结果时,我发现列"STATUS"存储"1".无论我插入什么值而不是"0",它都存储"1".我觉得如果我将列定义为BIT,那么它不应该允许插入除0和1之外的任何值.

是否有任何跟踪标志限制这种插入?我现在正在使用SQL Server 2012 SP3.

Har*_*rry 5

使用位数据类型.

"SQL Server数据库引擎优化了位列的存储.如果表中有8位或更少位列,则列存储为1个字节.如果存在9到16位列,则列存储为2个字节, 等等.

字符串值TRUEFALSE可以转换为比特值:TRUE被转换为1并FALSE转换为0.

转换为位会将任何非零值提升为1."

MSDN

  • `CHECK`约束在这里没有帮助.在应用这样的约束时,已经发生了对"bit"的隐式或显式转换,因此`CHECK`约束可能观察到的所有值都是0或1. (2认同)
  • @YashwanthAluru - 这不是*错误*。这是记录在案的行为。您必须记住,T-SQL 已经过时了,以至于在其他语言中“回到过去”也被认为将 0 视为假并将“任何非零值”视为真是明智的。所以他们保持向后兼容性的行为。 (2认同)