• SQL SERVER中关于NULL的设定


    SQL SERVER2005中关于NULL的设定

    NULL处理时SQL SERVER中一个比较麻烦的事情,有许多处理可能因为NULL而得到一些预想不到的结果。NULL在数据库中一般有三层含义:1、该属性值不适合该实体;2、该实体还没有改属性;3、该实体有该属性,但是现在还不知道。

    对于NULL的使用,和数据库的选项和会话的设置是息息相关的,也就是说不同的数据库的选项和会话的设置,对NULL的处理方式是不一样的。对于影响NULL处理的设置有如下几种:

    一、ANSI_NULL_DEFT_ON 及ANSI_NULL_DEFT_OFF。

    当该选项为OFF时,通过CREATE TABLE和ALTER TABLE创建的新列默认为NOT NULL,对应的数据库选项为ANSI NULL默认值为FALSE。当该选项为ON时,则默认值为NULL,对应的数据库选项为ANSI NULL默认值为TRUE。

    【测试1】

    SET ANSI_NULL_DFLT_ON OFF

    go

    create table test1(id int,col char(10))

    查看该表的属性,可以看到该表的两列不为空;

    【测试2】

    SET ANSI_NULL_DFLT_ON ON

    go

    create table test2(id int,col char(10))

    查看该表的属性,可以看到该表的两列为空;

    对于ANSI_NULL_DEFT_ON 及ANSI_NULL_DEFT_OFF是互斥选项,用于指明是否覆盖数据库选项,当开启一个选项时,都会迫使相反的那个选项关闭;但是关闭某个选项时,不会使相反的那个选项打开,而只是不再开启该选项。如果两个选项都关闭,那么将会启用数据库选项。

    【测试3】

    SET ANSI_NULL_DFLT_ON OFF

    SET ANSI_NULL_DFLT_Off OFF

    Go

    create table tb(id int,col char(10))—ANSI NULL默认为false

    查看该表的属性,可以看到该表的两列不允许为空;

    【测试4】

    SET ANSI_NULL_DFLT_ON OFF

    SET ANSI_NULL_DFLT_Off OFF

    Go

    create table tb(id int,col char(10))—ANSI NULL默认为true

    查看该表的属性,可以看到该表的两列允许为空;

    二、SET CONCAT_NULL_YIELDS_NULL

    当开启SET CONCAT_NULL_YIELDS_NULL时,如果串联操作的两个操作数中任意一个为NULL,则结果也为NULL;当关闭时,空值将按空字符串对待,默认为假。

    【重要提示】:

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

    【测试5】

    SET CONCAT_NULL_YIELDS_NULL on

    go

    select 'abc'+null

    结果:

    Null

    【测试6】

    SET CONCAT_NULL_YIELDS_NULL off

    go

    select 'abc'+null

    结果:

    Abc

    三、SET ANSI_NULLS

    当 SET ANSI_NULLS 为 ON 时,所有对空值的比较均取值为 UNKNOWN。当 SET ANSI_NULLS 为 OFF 时,如果数据值为 NULL,则所有数据对空值的比较将取值为 TRUE。如果未指定,则应用当前数据库的 ANSI NULLS 选项的设置。另外,当该选项为真是,必须使用IS NULL条件来判断一个列是否包含NULL值;当这个选项为假时,SQL SERVER中=NULL等价于IS NULL,<>NULL 等价于IS NOT NULL。

    【测试7】

    SET ANSI_NULLS off

    go

    select * from test where col=null

    结果

    ID   COL

    3           NULL

    【测试8】

    SET ANSI_NULLS on

    go

    select * from test where col=null

    结果

    四、SET ANSI_DEFAULTS

       默认为ON,当启用 (ON) 时,该选项将启用下列设置:

    SET ANSI_NULLS                 SET CURSOR_CLOSE_ON_COMMIT

    SET ANSI_NULL_DFLT_ON            SET IMPLICIT_TRANSACTIONS

    SET ANSI_PADDING                       SET QUOTED_IDENTIFIER

    SET ANSI_WARNINGS                   

    【测试9】(建立数据库采用默认设置,并且没有自己改变过用户选项)

    set ANSI_DEFAULTS on

    GO

    DBCC USEROPTIONS

    结果:

    SET OPTION

    VALUE

    TEXTSIZE

    2147483647

    LANGUAGE

    简体中文

    DATEFORMAT

    YMD

    DATEFIRST

    7

    LOCK_TIMEOUT

    -1

    QUOTED_IDENTIFIER

    SET

    ARITHABORT

    SET

    ANSI_NULL_DFLT_ON

    SET

    ANSI_WARNINGS

    SET

    ANSI_PADDING

    SET

    ANSI_NULLS

    SET

    CONCAT_NULL_YIELDS_NULL

    SET

    ISOLATION LEVEL

    READ COMMITTED

    【测试10】

    set ANSI_DEFAULTS off

    GO

    DBCC USEROPTIONS

    结果:

    SET OPTION

    VALUE

    TEXTSIZE

    2147483647

    LANGUAGE

    简体中文

    DATEFORMAT

    YMD

    DATEFIRST

    7

    LOCK_TIMEOUT

    -1

    ARITHABORT

    SET

    CONCAT_NULL_YIELDS_NULL

    SET

    ISOLATION LEVEL

    READ COMMITTED

    五、注意事项

    1、当进行修改数据库选项后,发现貌似不起作用,原因在于当进行查询的时候,会启动用户的选项,而该用户选项会覆盖数据库选项。用户选项可以使用DBCC USEROPTIONS

    查看,或者在【查询/查询选项】中查看。可以设置ANSI_DEFAULTS为OFF状态(可以关闭某些选项),或者在【查询/查询选项】关闭某些选项。

    2、在建立表的时候,建立在CREATE TABLE中显示的指定该列允许为空或者不为空,避免因为环境的设置而造成不必要的误解。

    3、进行数据库编程的时候,最好显式的指定涉及到NULL的选项,来覆盖默认数据库选项的影响,或者避免不同的用户选项所带来的影响。

    原文地址:http://blog.csdn.net/HEROWANG/article/details/5040603

  • 相关阅读:
    SpringBoot打jar包以及打成war包 (springboot2.0)
    学习软件开发的心得
    SQA计划
    继续冲吧
    别跑了,看看脚下有木有money
    springIOC的那些事
    ssm
    scrum 第二次冲刺
    云医院
    团队项目开发总结
  • 原文地址:https://www.cnblogs.com/jarick/p/2735594.html
Copyright © 2020-2023  润新知