为什么存储在NVARCHAR列中的值有时会用尾随空格填充?
我正在处理的应用程序是将Unicode字符串存储在SQL Server 2005数据库的NVARCHAR(50)
列中。
有时,数据库返回一个填充空格的字符串,直到列的最大长度(50)。 在其他时候,填充不会发生。
我认为这个列的类型最初被指定为NCHAR
,但是当我们意识到添加了空格时,我们将其更改为NVARCHAR(50)
。 这可能跟它有什么关系吗?
无论哪种方式,这个“function”可以关闭吗?
澄清
我刚刚意识到我上面写的内容并没有说明即使是新插入的字符串也会被填充空格。
NCHAR垫场,NVARCHAR没有。 但是如果数据来自旧字段,那么空格将保留直到修剪。
由于SET ANSI_PADDING ON (默认值),nchar类型引起的“遗留”空间先前仍然存在。
您需要使用RTRIM更新以删除尾随空格。
如果您之前已将它们从NCHAR
转换为NVARCHAR
,则先前输入的任何数据仍将包含尾随空格。 您可以通过以下方式更新它们:
UPDATE tablename SET column = RTRIM(column)
你有时可以这样做:
Update MyTable Set MyColumn = LTRIM(RTRIM(MyColumn));
NCHAR
列用空格填充,因为CHARACTER
是SQL
标准所要求的固定宽度数据类型:
如果未在
指定
VARYING
,则字符串的字符长度是固定的,并且是的值。
和
设
T
和V
为Subclause
申请中指定的TARGET
和VALUE
…
如果
T
的数据类型是长度为字符L
固定长度字符串,并且字符M
的长度M
小于L
,则T
的前M
字符设置为V
并且设置T
的最后LM
字符到s。
请注意, ANSI_PADDING = ON
(默认值)函数和除串联和比较之外的表达式隐式截断VARCHAR
参数的尾随空格:
SELECT LEN(a), LEN(b), LEN(a + b) FROM ( VALUES (CAST('a ' AS VARCHAR(100)), CAST('b' AS VARCHAR(100))) ) AS q(a, b) ----------- 1 1 3
你如何将价值观纳入表中? 我认为如果你有一个存储过程并且你明确地将更新这个列的参数的长度设置为50(比如通过SqlCommand),它可能最终会在ADO.NET端填充它。