2010-10-07 107 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