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

时间:2010-10-07 14:25:51

标签: sql-server

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

所以我这样做了:

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) - >炭(2)

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

4 个答案:

答案 0 :(得分:1)

在sql server中,Char(x)类型的列始终为x个字符长。这意味着如果插入一个比x短的字符数,则该值将用空格填充。为避免这种情况,您可以使用Varchar(x)代替。

答案 1 :(得分:1)

正如我所看到的,理由是,如果你说你想要一个两个字符的固定长度列,那么只有两个字符长的数据才是正确的,并且转换只是另一个数据库确保数据具有正确数据的方式。

当然,这也正是基于人们所说的可变长度列的机制这一事实。

答案 2 :(得分:1)

行为的原因是在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

答案 3 :(得分:-1)

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

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