Sql-Server

ANSI NULL OFF 預設在數據庫選項中

  • September 28, 2019

在 sql server 中創建數據庫時,我在這裡有一個奇怪的行為。創建數據庫時,預設 ANSI 值設置為 false。

ALTER DATABASE [NewDB] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [NewDB] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [NewDB] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [NewDB] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [NewDB] SET ARITHABORT OFF 
GO

但是,當我在查詢編輯器中創建數據庫後執行查詢時

SELECT * FROM [dbo].[TableName] WHERE [ColumnName] = NULL

很明顯,實際設置是ANSI_NULLS ON因為沒有行返回。

==========================================================================

我的問題是:

1)為什麼會這樣?數據庫選項是ANSI_NULLS OFF,但查詢結果實際上顯示它是ANSI_NULLS ON。這也適用於所有其他 ANSI 設置,當ANSI_NULLS ON數據庫選項設置為 OFF 時,它實際上類似於。

2)為什麼預設數據庫選項是ANSI_NULLS OFF而不是ANSI_NULLS ON. (類似的也適用於其他 ANSI 選項,為什麼它預設為OFF因為ON是推薦的那個?)

我已經從 SQL Server 2012 到 2017 對此進行了測試,所有版本的結果都相同。我對此感到很困惑。

一些數據庫設置是無用的。正如你所注意到的。

客戶端 API(ODBC 等)將覆蓋它們。而且,客戶端應用程序(例如 SSMS)可以進一步覆蓋 API 覆蓋的任何內容。

那麼為什麼那些數據庫設置仍然存在呢?因為石器時代的 API 沒有做這樣的覆蓋。我在這裡考慮 DbLibrary,但這也可能適用於其他非常古老的 API。

為什麼它們預設具有如此奇怪的數據庫選項值?因為向後兼容。即,您可以“預設”創建數據庫並“預設”使用石器時代的 API,並獲得與 1989 年相同的行為。

引用自:https://dba.stackexchange.com/questions/249854