关于SET ANSI_PADDING的作用
Sql Server 中经常会用到会自动生成SET ANSI_PADDING { ON | OFF }语句,具体作用是什么呢?
一、Sql Server的填充和裁剪规则是,char和varchar指的是在值的尾部对空格的填充或裁剪,binary和varbinary指的是在值的尾部对零的填充或裁剪。
二、如果ANSI_PADDING设置为ON,char(n)和binary(n)会根据Sql Server的填充规则进行填充(如果值可为NULL,则赋值为NULL时不填充),填充以达到列的长度;varchar(n) 或 varbinary(n)则根据实际情况进行存储。
比如:char(10)和varchar(10),如果赋值为'hello'(不包括引号),那么char(10)就会以'hello '(不包括引号,hello后有5个空格),varchar就会只存储'hello'(不包括引号),所以varchar会根据实际的赋值情况分配空间,char则会根据长度定义进行填充。
同理,binary(4)和varbinary(4) 如果赋值为0x00ee,那么binary(4)会以0x00ee0000存储;varbinary(4)就会只存储为0x00ee。
如果在赋值或插入记录时char和varchar尾随有空格或binary和varbinary尾随有零,如'hello '(不包括引号)和0x00ee00,Sql Server会直接存储,不做任何处理,相当于空格和零是值的一部分。
三、如果ANSI_PADDING设置为OFF,char和binary将不会在尾部用空格或零进行填充,如果char、varchar、binary和varbinary的值尾随有空格或零,Sql Server将按裁剪规则进行裁剪存储。
四、此设置只影响新列的定义,创建列后,SQL Server会基于创建列时的设置存储这些值,以后对此设置的更改不会影响现有的列。
五、SET ANSI_PADDING 的默认值为 ON。SQL Server 的 SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB 提供程序在连接时会自动将 ANSI_PADDING 设置为 ON。
六、针对char和binary,在如果ANSI_PADDING设置为OFF时是否要在尾部进行填充以达到列长度,不同的Sql Server版本不一致Sql Server 2000是不填充,Sq Server 2008则还是继续填充以保存值与列定义的长度一致。其他版本尚未测试。