日期:2014-05-18  浏览次数:20614 次

关于VARCHAR 类型插入表中自动过滤空格的问题?
MS-2000 表的字段定义成VARCHAR(30),在存储过程声明了一个变量类型是VARCHAR(50),
比如@VAR = '12345 ',在插入表后值中的空格被自动过滤掉,不知道什么原因?
因为这是在做数据移植后出现的问题(移植也由测试库移到产品库,不需要考滤兼容问题),所以表的结构以及字段的类型是不可能改,所以类拟这些方法都是不能使用的.
所以只能修改存储过程脚本或数据库的设置.

------解决方案--------------------
varchar型数据自动去掉后面的空格.
------解决方案--------------------
varchar变长
------解决方案--------------------
探讨
引用:
varchar型数据自动去掉后面的空格.

------解决方案--------------------
探讨
但是在我的测试库中完全没有问题,我已经比较了表的设置,与数据库的版本以及补号的版本都是相同的.
这个产品已经到客户测试介段出现的问题.

------解决方案--------------------
好像找到原因了 

varchar 数据类型是一种长度可变的数据类型。比列的长度小的值,不会在值的右边填补来达到列的长度。在创建列时,如果 ANSI_PADDING 选项设置为 OFF,则所有存储在列中的字符值末尾的空格都将截断。在创建列时,如果 ANSI_PADDING 设置为 ON,则末尾空格将不截断。
------解决方案--------------------
SQL code
 
SET ANSI_PADDING { ON | OFF }
针对小于定义的列大小的值以及 char、varchar、binary 和 varbinary 数据中有尾随空格的值,此语句可以控制存储此类值的方式


下表显示在将值插入含有 char、varchar、binary 和 varbinary 数据类型的列时,SET ANSI_PADDING 设置的效果。

设置  char(n) NOT NULL 或 binary(n) NOT NULL  char(n) NOT 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 列中的二进制值的尾随零。



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



------解决方案--------------------
探讨
set ANSI_NULLS ON,
CONCAT_NULL_YIELDS_NULL ON,
ANSI_WARNINGS on,
ARITHABORT on,
ANSI_PADDING on

以上几个设置均尝试过,问题依然存在.