SET ANSI_PADDING (Transact-SQL)
控制列如何存储长度比列的已定义大小短的值,以及如何存储 char、varchar、binary 和 varbinary 数据中含有尾随空格的值。
适用范围:SQL Server(SQL Server 2008 到当前版本)。 |
语法
SET ANSI_PADDING { ON | OFF }
注释
定义为 char、varchar、binary 和 varbinary 数据类型的列有一个定义的大小。
此设置只影响新列的定义。 创建列后,SQL Server 会基于创建列时的设置存储这些值。 以后对此设置的更改不会影响现有的列。
备注
建议始终将 ANSI_PADDING 设置为 ON。
下表显示在将值插入数据类型为 char、varchar、binary 和 varbinary 的列时,SET ANSI_PADDING 设置的效果。
设置 |
char(n) NOT NULL 或 binary(n) NOT NULL |
char(n) NULL 或 binary(n) NULL |
varchar(n) 或 varbinary(n) |
---|---|---|---|
ON |
填充原始值(char 列具有尾随空格的值,binary 列具有尾随零的值),以达到列的长度。 |
如果 SET ANSI_PADDING 为 ON,则遵从与 char(n) 或 binary(n) NOT NULL 相同的规则。 |
不剪裁插入 varchar 列中的字符值的尾随空格。 不剪裁插入 varbinary 列中的二进制值的尾随零。 不将值填充到列的长度。 |
OFF |
填充原始值(char 列具有尾随空格的值,binary 列具有尾随零的值),以达到列的长度。 |
如果 SET ANSI_PADDING 为 OFF,则遵从与 varchar 或 varbinary 相同的规则。 |
剪裁插入 varchar 列中的字符值的尾随空格。 剪裁插入 varbinary 列中的二进制值的尾随零。 |
备注
进行填充时,char 列用空格填充,binary 列用零填充。进行剪裁时,char 列的尾随空格被剪裁,binary 列的尾随零被剪裁。
在创建或更改计算列的索引或索引视图时,SET ANSI_PADDING 必须为 ON。 有关索引视图和计算列的索引必需的 SET 选项设置的详细信息,请参阅 SET 语句 (Transact-SQL) 中的“使用 SET 语句时的注意事项”。
SET ANSI_PADDING 的默认值为 ON。 进行连接时,SQL Server 的 SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB 访问接口会自动将 ANSI_PADDING 设置为 ON。 在连接之前,您可以在应用程序的 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性集合中配置此设置。 对于来自 DB-Library 应用程序的连接,SET ANSI_PADDING 的默认设置为 OFF。
SET ANSI_PADDING 设置不影响 nchar、nvarchar、ntext、text、image 和大型值。 它们始终显示 SET ANSI_PADDING ON 行为。 这表示不剪裁尾随空格和尾随零。
如果 SET ANSI_DEFAULTS 为 ON,则启用 SET ANSI_PADDING。
SET ANSI_PADDING 的设置是在执行或运行时设置的,而不是在分析时设置的。
要查看此设置的当前设置,请运行以下查询。
DECLARE @ANSI_PADDING VARCHAR(3) = 'OFF';
IF ( (16 & @@OPTIONS) = 16 ) SET @ANSI_PADDING = 'ON';
SELECT @ANSI_PADDING AS ANSI_PADDING;
权限
要求具有 public 角色的成员身份。
示例
下面的示例演示了该设置对上述每个数据类型的影响。
PRINT 'Testing with ANSI_PADDING ON'
SET ANSI_PADDING ON;
GO
CREATE TABLE t1 (
charcol CHAR(16) NULL,
varcharcol VARCHAR(16) NULL,
varbinarycol VARBINARY(8)
);
GO
INSERT INTO t1 VALUES ('No blanks', 'No blanks', 0x00ee);
INSERT INTO t1 VALUES ('Trailing blank ', 'Trailing blank ', 0x00ee00);
SELECT 'CHAR' = '>' + charcol + '<', 'VARCHAR'='>' + varcharcol + '<',
varbinarycol
FROM t1;
GO
PRINT 'Testing with ANSI_PADDING OFF';
SET ANSI_PADDING OFF;
GO
CREATE TABLE t2 (
charcol CHAR(16) NULL,
varcharcol VARCHAR(16) NULL,
varbinarycol VARBINARY(8)
);
GO
INSERT INTO t2 VALUES ('No blanks', 'No blanks', 0x00ee);
INSERT INTO t2 VALUES ('Trailing blank ', 'Trailing blank ', 0x00ee00);
SELECT 'CHAR' = '>' + charcol + '<', 'VARCHAR'='>' + varcharcol + '<',
varbinarycol
FROM t2;
GO
DROP TABLE t1;
DROP TABLE t2;