2011-10-26 85 views
1

有人可以向我解釋在SQL服務器中默認啓用ANSI填充的邏輯。爲什麼在SQL Server中默認啓用ANSI填充?

凡兩段代碼如下還真

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

if '  ' = '' begin 
    print 'true' 
end 
else begin 
    print 'false' 
end 

編輯:我不在乎,你可以將其關閉。有誰知道它爲什麼在?這是數據庫設計決策嗎?它是一個數據庫優化?這被使用的積極性是什麼?它對我來說當然沒有多大意義 - 我所看到的只是消極的一面。

+0

好,從它的名字,邏輯將是符合標準? ANSI =美國國家標準學會。 – derobert

+0

這只是一個默認設置。您可以輕鬆更改它,無論是每個數據庫還是單個批次/事務。與默認排序規則不區分大小寫一樣,有些人會認爲這是一個糟糕的選擇。 – Yuck

+3

請注意,'SET ANSI_PADDING OFF'是[不建議使用的功能](http://msdn.microsoft.com/zh-cn/library/ms143729.aspx),在未來的某些版本中甚至不允許。 –

回答

4

To be compliant with the ANSI/ISO SQL-92 specification

的SQL Server遵循ANSI/ISO SQL-92規範對如何比較字符串 與空間(第8.2節 ,一般3#規則)。 ANSI標準要求填充字符 用於比較的字符串,以便它們的長度在比較之前匹配 。填充直接影響WHERE 和HAVING子句謂詞以及其他Transact-SQL字符串 比較的語義。例如,對於大多數比較操作,Transact-SQL將字符串'abc'和 'abc'視爲等效。

2

測試行爲:

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