【问题标题】:Non-varying characters, padding and LEN() confusion不变字符、填充和 LEN() 混淆
【发布时间】:2011-10-10 02:53:54
【问题描述】:

如果要存储的字符串小于该列可以存储的最大字符数,则非可变字符列C1 用空格填充字符串。因此,当以下语句插入一行时,其C1 字符串包含 80 个字符,其中 74 个是空格字符。

CREATE TABLE MyTable
(
    C1 char(80)
);

INSERT INTO MyTable (C1)
VALUES ('   ABC');

一)

LEN() 返回指定字符串的字符数 表达式,不包括尾随空格。

我意识到这 74 个额外的空格是由数据库系统而不是用户添加的,但事实仍然是字符串确实包含这些空格,所以 LEN() 在结果?

b) MS Sql 服务器似乎没有在查询结果窗口中显示这 74 个额外的空格。这是为什么呢?

c) 无论如何,我假设当我们从数据库中检索这一行时,C1 字符串将包含所有这些额外的空格?

谢谢

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    a) 这就是 LEN 的定义方式,使用 DATALENGTH 来获取包括尾随空格在内的长度(但除以 2 来获取 unicode 数据类型的字符长度)。

    在 SQL Server 中,用于相等比较的尾随空格也会被忽略。即SELECT * FROM MyTable WHERE C1 = ' ABC' 将返回结果。

    b) 在 SSMS 中,实际上返回的尾随空格并不是很明显,在网格模式的结果中,列宽并不表示这一点,但是如果您将C1 复制并粘贴到其他地方,您将看到尾随空格是实际上保存下来了。

    看到这一点的一种方法是使用DBCC OUTPUTBUFFER

    CREATE TABLE MyTable
    (
        C1 char(80)
    );
    
    INSERT INTO MyTable (C1)
    VALUES ('   ABC');
    
    SELECT C1
    FROM MyTable
    
    DBCC OUTPUTBUFFER (@@SPID)
    

    我的结果摘录如下

    00000020   00 20 20 20 41 42 43 20 20 20 20 20 20 20 20 20   .   ABC         
    00000030   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
    00000040   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
    00000050   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
    00000060   20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                   
    

    ABC后面的所有空格都可以看到

    c) 是的。见(b)

    【讨论】:

    • 文本模式看起来与varchar 相同,所以我猜文本模式使用字段 def 进行演示,而不是字段中的实际字符。另一方面,网格模式会适应实际数据,但会删除尾随空格。
    • @MikaelEriksson - 在文本模式下,您可以选择并突出显示 char 版本的尾随空格,varchar 版本中没有任何内容可供选择。
    • 实际上-在进一步的测试中,似乎这种效果总是出现在最后一列,与varchar vs char无关。
    • 是的 - 我在 C1 之后有一个额外的列。
    猜你喜欢
    • 2020-11-20
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多