代码之家  ›  专栏  ›  技术社区  ›  John Leidegren

SQL Server char(1)和char(2)列

  •  4
  • John Leidegren  · 技术社区  · 14 年前

    我需要一个表来记录数据模型中的所有类型。我没有那么多的类型,但有相当多的类型。理想情况下,简短的描述名称会很好地工作。

    所以我这样做了:

    CREATE TABLE EntityType
    (
        EntityTypeID char(2) PRIMARY KEY,
        EntityTypeName varchar(128) NOT NULL
    )
    

    并将一些数据放入表中:

    INSERT INTO EntityType VALUES ('A', 'Type1')
    INSERT INTO EntityType VALUES ('B', 'Type2')
    

    但是我这样的疑问让我困惑:

    DECLARE @pEntityType char(1)
    SET @pEntityType = 'A'
    SELECT ''''+EntityTypeID+'''', EntityTypeName 
    FROM EntityType 
    WHERE EntityTypeID = @pEntityType
    

    结果生成“a”,并且在该文本中有空白。

    我的理解是有一个隐式转换正在转换char(1)->char(2)

    我不是在抱怨,但这背后的理由是什么?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Martin Smith    14 年前

    这种行为的原因是,在SQL Server的字符串比较中忽略了尾随空格。无论使用的是固定长度数据类型还是可变长度数据类型,都会发生这种情况,如下所示。

    DECLARE @EntityType TABLE
    (
        EntityTypeID varchar(2) PRIMARY KEY,
        EntityTypeName varchar(128) NOT NULL
    )
    
    INSERT INTO @EntityType VALUES ('A ', 'Type1')
    INSERT INTO @EntityType VALUES ('B', 'Type2')
    
    DECLARE @pEntityType varchar(1)
    SET @pEntityType = 'A'
    SELECT ''''+EntityTypeID+'''', EntityTypeName 
    FROM @EntityType 
    WHERE EntityTypeID = @pEntityType
    
        2
  •  1
  •   Klaus Byskov Pedersen    14 年前

    在SQL Server中,类型为的列 Char(x) 将永远 x 查尔斯长。这意味着如果插入的字符数小于 X ,该值将用空格填充。为了避免这种情况,您可以使用 Varchar(x) 相反。

        3
  •  1
  •   Jon Hanna    14 年前

    正如我所看到的,其基本原理是,如果您说想要一个两个字符的固定长度列,那么只有当数据是两个字符长时,数据才是正确的,而转换只是数据库确保其具有正确数据的另一种方式。

    当然,正如人们所说,这也是基于这样一个事实,即存在一种可变长度列的机制。

        4
  •  -1
  •   Sachin Shanbhag    14 年前

    char()是根据指定的数字分配字符的函数。它不会调整回您传递的数据的长度。

    因此,如果在char(2)中指定2,则字段将始终有2个字符。