Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server-位数据类型问题_Sql Server_Sqldatatypes - Fatal编程技术网

Sql server SQL Server-位数据类型问题

Sql server SQL Server-位数据类型问题,sql-server,sqldatatypes,Sql Server,Sqldatatypes,我的SQL Server 2012中有一个表,如下所示 CREATE TABLE TEST (ID INT,NAME VARCHAR(100),STATUS BIT); 我错误地插入了这样的数据 INSERT INTO TEST SELECT 1,'A',2; 当我查询结果时,我发现“STATUS”列存储“1”。无论我插入什么值而不是“0”,它都存储“1”。我觉得如果我将列定义为位,那么它就不允许插入除0和1之外的任何值 是否有任何跟踪标志限制此类插入?我现在正在使用SQL Server 2

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

CREATE TABLE TEST (ID INT,NAME VARCHAR(100),STATUS BIT);
我错误地插入了这样的数据

INSERT INTO TEST SELECT 1,'A',2;
当我查询结果时,我发现“STATUS”列存储“1”。无论我插入什么值而不是“0”,它都存储“1”。我觉得如果我将列定义为位,那么它就不允许插入除0和1之外的任何值


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

使用位数据类型

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

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

转换为位会将任何非零值提升为1。”


您所说的“插入任何值”是什么意思?请给出一个示例值?我指的是除“0”以外的任何值。在我的问题中,我给出了一个例子“2”。是的,这是“转换为位会将任何非零值提升为1”。问题是隐式转换。只要使用带有显式数据类型的参数化查询,就可以了。面对现实,每当有人试图在位列或变量上存储非NULL、零或一个值时,Microsoft都应该发出警告(如果ANSI_警告为开),与其永远保留这种无意义的错误,为什么不在将值插入数据库之前在应用程序中设置此限制?或者这不是一个选项?
检查
约束在这里没有帮助。当应用这样的约束时,隐式或显式转换到
已经发生,因此
检查
约束可能观察到的所有值都是0或1。我想您还没有理解我的要求。我不能对所有表声明检查约束。我需要知道这是否是SQL Server中的错误,是否存在任何跟踪标志来限制用户插入除0或1以外的任何值。这意味着如果我插入0和1之外的任何值,就会出现“数据过长”或“数据溢出”之类的错误。@YashwanthAluru-这不是错误。这是记录在案的行为。您必须记住,T-SQL很古老,以至于在其他语言中“回到过去”也被认为是明智的,将0视为false,“任何非零值”视为true。因此,它们保持向后兼容性的行为。似乎如果您想要该功能,您应该使用带有检查约束的tinyint。