Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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中启用ANSI填充?_Sql_Sql Server_String - Fatal编程技术网

为什么默认情况下在SQL Server中启用ANSI填充?

为什么默认情况下在SQL Server中启用ANSI填充?,sql,sql-server,string,Sql,Sql Server,String,有人能告诉我在SQL server中默认启用ANSI填充的逻辑是什么吗 其中,下面的两个代码段返回true if len(' ') = len('') begin print 'true' end else begin print 'false' end if ' ' = '' begin print 'true' end else begin print 'false' end 编辑:我不在乎你是否可以关闭它。有人知道它为什么开着吗?

有人能告诉我在SQL server中默认启用ANSI填充的逻辑是什么吗

其中,下面的两个代码段返回true

if len('       ') = len('') begin
    print 'true'
end
else begin
    print 'false'
end

if '       ' = '' begin
    print 'true'
end
else begin
    print 'false'
end
编辑:我不在乎你是否可以关闭它。有人知道它为什么开着吗?这是一个数据库设计决策吗?这是数据库优化吗?这种方法的优点是什么?这对我来说毫无意义——我所看到的都是负面消息。

:

SQL Server遵循ANSI/ISO SQL-92规范(第8.2节, ,关于如何比较字符串的一般规则#3) 有空格。ANSI标准要求字符填充 用于比较的字符串,以便它们的长度在比较之前匹配 比较它们。填充直接影响WHERE的语义 并具有子句谓词和其他Transact-SQL字符串 比较。例如,Transact-SQL考虑字符串“abc”和 对于大多数比较操作,“abc”是等效的

:

SQL Server遵循ANSI/ISO SQL-92规范(第8.2节, ,关于如何比较字符串的一般规则#3) 有空格。ANSI标准要求字符填充 用于比较的字符串,以便它们的长度在比较之前匹配 比较它们。填充直接影响WHERE的语义 并具有子句谓词和其他Transact-SQL字符串 比较。例如,Transact-SQL考虑字符串“abc”和 对于大多数比较操作,“abc”是等效的

测试行为:

SELECT SESSIONPROPERTY('ANSI_PADDING') AS [ANSI_PADDING]

SET ANSI_PADDING ON

IF '       ' = '' BEGIN
    PRINT 'TRUE'
END
ELSE BEGIN
    PRINT 'FALSE'
END

SET ANSI_PADDING OFF

IF '       ' = '' BEGIN
    PRINT 'TRUE'
END
ELSE BEGIN
    PRINT 'FALSE'
END

SET ANSI_PADDING ON
输出:

TRUE
TRUE
测试行为:

SELECT SESSIONPROPERTY('ANSI_PADDING') AS [ANSI_PADDING]

SET ANSI_PADDING ON

IF '       ' = '' BEGIN
    PRINT 'TRUE'
END
ELSE BEGIN
    PRINT 'FALSE'
END

SET ANSI_PADDING OFF

IF '       ' = '' BEGIN
    PRINT 'TRUE'
END
ELSE BEGIN
    PRINT 'FALSE'
END

SET ANSI_PADDING ON
输出:

TRUE
TRUE

好吧,从它的名字来看,逻辑应该是遵守一个标准?ANSI=美国国家标准协会。这只是一个默认设置。您可以很容易地对其进行更改,可以按数据库更改,也可以按单个批次/事务更改。与默认排序规则相同,不区分大小写,有些人会认为这是一个糟糕的选择。请注意,
设置ANSI_PADDING OFF
是一个在将来的版本中甚至不允许使用的排序规则。示例中的结果在
设置ANSI_PADDING OFF下不会更改
ANSI_PADDING
Good point@MartinSmith-我否决了这个问题,因为行为似乎与设置无关。是否有一个设置可以改变问题中代码的行为?好吧,从名称来看,逻辑应该是符合一个标准?ANSI=美国国家标准协会。这只是一个默认设置。您可以很容易地对其进行更改,可以按数据库更改,也可以按单个批次/事务更改。与默认排序规则相同,不区分大小写,有些人会认为这是一个糟糕的选择。请注意,
设置ANSI_PADDING OFF
是一个在将来的版本中甚至不允许使用的排序规则。示例中的结果在
设置ANSI_PADDING OFF下不会更改
ANSI_PADDING
Good point@MartinSmith-我否决了这个问题,因为行为似乎与设置无关。是否存在更改问题中代码行为的设置?