为什么存储在NVARCHAR列中的值有时会用尾随空格填充?

时间:2011-04-21 15:18:19

标签: c# sql-server-2005

我正在处理的应用程序是将Unicode字符串存储在SQL Server 2005数据库的NVARCHAR(50)列中。

有时,数据库返回一个填充空格的字符串,直到列的最大长度(50)。在其他时候,填充不会发生。

我认为此列的类型最初指定为NCHAR,但是当我们意识到添加了空格时,我们将其更改为NVARCHAR(50)。这跟它有什么关系吗?

无论哪种方式,这个'功能'可以关闭吗?

澄清

我刚刚意识到我上面写的内容并没有说清楚即使是新插入的字符串也会填充空格。

7 个答案:

答案 0 :(得分:14)

NCHAR填补了这个领域,NVARCHAR没有。但是如果数据来自旧字段,那么空格将保持不变。

答案 1 :(得分:7)

如果您之前已将它们从NCHAR转换为NVARCHAR,则之前输入的所有数据仍将包含尾随空格。您可以通过以下方式更新它们:

UPDATE tablename
SET column = RTRIM(column)

答案 2 :(得分:7)

由nchar类型引起的“遗留”空格以前仍然存在,因为SET ANSI_PADDING ON是默认值。

您需要使用RTRIM更新以删除尾随空格。

答案 3 :(得分:1)

您有时可以这样做:

Update MyTable Set MyColumn = LTRIM(RTRIM(MyColumn));

答案 4 :(得分:1)

NCHAR列用空格填充,因为CHARACTERSQL标准要求的固定宽度数据类型:

  

如果VARYING中未指定<character string type>,则                 字符串的字符长度是固定的                 是<length>的值。

  

TV成为申请时指定的TARGETVALUE               这个Subclause

     

...

     

如果T的数据类型是固定长度的字符串                 字符L的长度和M的字符V的长度                 小于L,则M的前T个字符设置为V                 并且L-M的最后T个字符设置为<space> 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

答案 5 :(得分:1)

你是如何将价值纳入表中的?我认为如果你有一个存储过程并且你明确地将更新该列的参数的长度设置为50(比如通过SqlCommand),它可能最终会在ADO.NET端填充它。

答案 6 :(得分:0)

我在尝试解决这个完全相同的问题时遇到了这个线程,并将发布我的解决方案。

我使用了NChar,因为这是我的第一个SQL数据库,我不知道填充的空间。然后,我创建了LINQ-to-SQL类,以提供对数据库的访问。当我以后更新数据库时,我没有更新LINQ-to-SQL类,因此后面的代码中仍然包含NChar。我更改了它们以解决问题。

如果您未使用此确切方法,则可能有类似的解决方案。用于添加记录的内容尚未更新。