Sql server SQL Server-位数据类型问题
我的SQL Server 2012中有一个表,如下所示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
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。