Unicode欄位也有collation

發糞塗牆發表於2012-06-02

轉自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/11/unicode-collation.aspx

一個常常讓人困惑的問題就是,為什麼SQL Server 的Unicode 欄位(nvarchar/nchar/ntext)也有collation定義呢?Unicode欄位不是可以儲存多語言嗎?比如下面的表定義:

 

CREATE TABLE tt1

(

  c1 int,

  c2 nvarchar(10)  collate Chinese_PRC_Stroke_CI_AS

 )

 

上門的c2 欄位是nvarchar型別,那麼加的collate Chinese_PRC_Stroke_CI_AS有啥意義呢。 或許你會問,如果我不加上collate不就行啦. 其實如果沒有後面的collate, SQL server 會預設給你加上資料庫的collation. 也就是說nvarchar/nchar等欄位一定是有collation的.

 

那麼上面定義的collate有何意義?是否就是指這個c2欄位只能存放中文字元呢?不是. Unicode 的collation 的作用是排序規則. 就是說, 這個欄位依舊可以存放多國語言,但是你只能指定一種排序規則,如上面的table, 我指定的排序規則就是按照中文排序,即使你存放的是別的語言..

 

讓我們看一看例子:

 

IF OBJECT_ID ('tt1','U') IS NOT NULL

drop table tt1

go

CREATE TABLE tt1

(

  c1 int,

  c2 nvarchar(10)  collate Chinese_PRC_Stroke_CI_AS

 )

  

go  

 

INSERT tt1 VALUES (1, N'');

INSERT tt1 VALUES (2, N'');

INSERT tt1 VALUES (3, N'');

INSERT tt1 VALUES (4, N'');

GO

select * from tt1 order by c2

 

結果如下:

 

c1          c2

----------- ----------

1           一

2           二

3           三

4           四

 

(4 row(s) affected)

 

你可以看到c2列的排序結果不錯. 如果我們使用另外一種collation, 那麼結果可能是不同的,讓我們看看:

 

IF OBJECT_ID ('tt1','U') IS NOT NULL

drop table tt1

go

CREATE TABLE tt1

(

  c1 int,

  c2 nvarchar(10)  collate latin1_general_cs_as

 )

  

go  

 

INSERT tt1 VALUES (1, N'');

INSERT tt1 VALUES (2, N'');

INSERT tt1 VALUES (3, N'');

INSERT tt1 VALUES (4, N'');

GO

select * from tt1 order by c2

 

 

結果是不一樣的, C2列的order by 結果和上面是有差異的:

 

c1          c2

----------- ----------

1           一

3           三

2           二

4           四

 

(4 row(s) affected)


相關文章