2010-10-07 106 views
4

我需要一个表来记录数据模型中的所有类型。我没有那么多的类型,但是他们的公平交易。理想情况下,简短的描述性名称可以很好地工作。SQL Server char(1)和char(2)列

所以我这样做:

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)

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

回答

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 
+0

好吧,我仍然没有抱怨,而且我确实觉得它很有用,但我确实发现它很奇怪......所有字符串比较都应该忽略拖尾空白的决定对我来说似乎仍然有些武断。 – 2010-10-07 18:52:27

-1

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

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

1

在sql server中,类型为Char(x)的列将始终为x chars long。这意味着如果插入的字符数量少于x,则该值将填充空格。为了避免这种情况,您可以改用Varchar(x)

+0

只是为了补充每个可变长度列有2个字节的开销,所以这会消耗更多的空间。 – 2010-10-07 14:36:40

1

正如我所看到的,理由是如果你说你想要一个固定长度的双字符列,那么数据只有在长度为两个字符时才是正确的,而转换只是另一个字符数据库确保其具有正确数据的方式。正如人们所说的那样,这当然也是基于这样一个事实,即有一种可变长度列的机制。

+0

我从来没有,我的意思是永远不会使用固定大小的列,但这似乎很适合它。我只是有点困惑,我没有想到在任何情况下SQL Server都会忽略尾随的空白。 – 2010-10-07 18:50:52