数据库选项:为什么默认情况下"SET ANSI_NULLS OFF"对于新数据库是OFF?

All*_* Xu 5 sql-server

使用SSMS 2014:

当我使用SSMS创建一个新数据库时,新数据库有一些奇怪的默认设置

ALTER DATABASE [del] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [del] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [del] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [del] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [del] SET ARITHABORT OFF 
Run Code Online (Sandbox Code Playgroud)

当我测试脚本和存储过程时,似乎ANSI_NULLS实际上是ON.

我很困惑为什么在创建数据库时像ANSI_NULLS这样重要的设置是关闭的?以及它在我的脚本中如何变为ON?

The*_*war 5

它如何在我的脚本中变为 ON?

使用 SET 语句设置的连接级别设置会覆盖 ANSI_NULLS 的默认数据库设置。
默认情况下,ODBC 和 OLE DB 客户端在连接到 SQL Server 实例时发出连接级 SET 语句,将会话的 ANSI_NULLS 设置为 ON。

当我创建数据库时,我很困惑为什么像 ANSI_NULLS 这样的重要设置是关闭的?

我已经创建了同时关闭和打开空值的数据库,但是每次当我尝试插入时,客户端驱动程序都会为我生成这些设置选项为 ON

以下是 MSDN 对此的看法。

在 SQL Server 的未来版本中,ANSI_NULLS 将始终为 ON,并且任何将该选项显式设置为 OFF 的应用程序都将产生错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。

最近,我能想到为什么这个选项设置为 ON,可能是由于兼容性

  • 仍然奇怪和不清楚为什么 MS 选择在默认情况下使用 ANSI NULLS OFF 创建新数据库。特别是考虑到您引用的 MSDN 中的文本,表明将来即使将 ANSI_NULLS 显式设置为 False,它们也会引发错误。我不记得在安装服务器时注意到这样的选择。但是,您可以在名为“model”的系统数据库中更改此设置,该数据库是创建的所有新数据库的模型。模型中的设置将作为新数据库的默认设置。 (3认同)