定序和國際詞彙
SQL Server 中的定序會提供資料的排序規則、大小寫和區分腔調字屬性。與字元資料類型 (例如 char 和 varchar) 搭配使用的定序會指示字碼頁,以及可針對該資料類型表示的對應字元。不論您是安裝 SQL Server 的新執行個體、還原資料庫備份,還是將伺服器連接至用戶端資料庫,請務必了解您即將使用之資料的地區設定需求、排序次序和區分大小寫與腔調字。
當您針對伺服器、資料庫、資料行或運算式選取定序時,就是將某些特性指派給資料,而這些特性將會影響資料庫中許多作業的結果。例如,當您使用 ORDER BY 來建構查詢時,結果集的排序次序可能會相依於套用至資料庫的定序或在查詢運算式層級指定於 COLLATE 子句中的定序。
定序可包含下列任一個或所有特性:
區分大小寫
區分腔調字
區分假名
區分全半形
為了有效運用 SQL Server 中的定序支援,您必須了解本主題中定義的詞彙,以及它們與資料特性的關聯。
詞彙
定序
地區設定
Unicode
字碼頁
資料類型
排序次序
定序
定序指定位元模式,代表資料集的每一個字元。定序也決定排序和比較資料的規則。SQL Server 可支援在單一資料庫中以不同定序儲存物件。對於非 Unicode 資料行,定序設定則指定資料的字碼頁以及可代表的字元。在非 Unicode 資料行之間移動的資料必須從來源字碼頁轉換成目的地字碼頁。
當 Transact-SQL 陳述式在各有不同定序設定的不同資料庫內容中執行時,陳述式的結果可能不同。如果可能的話,請針對組織使用標準化定序。這樣您就不需要在每一個字元或 Unicode 運算式中明確指定定序。如果您必須使用有不同定序和字碼頁設定的物件,則在編寫查詢程式碼時,必須考量定序優先順序的規則。如需詳細資訊,請參閱<定序優先順序 (Transact-SQL)>。
定序的特性是區分語言、區分大小寫、區分腔調字、區分假名和區分全半形。
SQL Server 定序包括下列定序集:
Windows 定序
Windows 定序會定義規則,以便依據相關聯的 Windows 系統地區設定儲存字元資料。如果是 Windows 定序,非 Unicode 資料的比較是使用與 Unicode 資料相同的演算法來實作。基本 Windows 定序規則會指定套用字典排序時使用的字母或語言,以及用來儲存非 Unicode 字元資料的字碼頁。Unicode 和非 Unicode 排序都與特定 Windows 版本中的字串比較相容。如此可讓 SQL Server 中的各種資料類型取得一致性,同時讓開發人員能夠使用與 SQL Server 相同的規則,在應用程式中排序字串。如需詳細資訊,請參閱<安裝程式中的定序設定>。二進位定序
二進位定序依據地區設定和資料類型所定義的字碼值順序來排序資料。它們會區分大小寫。SQL Server 中的二進位定序會定義要使用的地區設定和 ANSI 字碼頁。這會強制使用二進位排序次序。因為它們相對而言較為簡單,所以二進位定序可提升應用程式效能。如果是非 Unicode 資料類型,資料比較是依據 ANSI 字碼頁中所定義的字碼元素。如果是 Unicode 資料類型,資料比較則是依據 Unicode 字碼指標。如果是 Unicode 資料類型的二進位定序,在資料排序時不會考量地區設定。例如,Latin_1_General_BIN 和 Japanese_BIN 用於 Unicode 資料時會產生相同的排序結果。舊版 SQL Server 中的二進位定序會以 WCHAR 比較第一個字元,然後使用逐一比較位元組的方式。為了與舊版相容,現有的二進位定序語意不變。
在這一版的 SQL Server 中,二進位定序包括一組純字碼元素比較定序。您可以移轉至二進位定序以便運用純字碼元素比較。您應該使用二進位定序來開發新的應用程式。BIN2 後置詞會識別實作新字碼元素定序語意的定序名稱。此外,還有對應至新二進位排序之 BIN2 的比較旗標。如需詳細資訊,請參閱<使用 BIN 和 BIN2 定序的指導方針>。
SQL Server
SQL Server 定序 (SQL_*) 會提供與 SQL Server 舊版之間的排序次序相容性。非 Unicode 資料的字典排序規則與 Windows 作業系統提供的任何排序常式不相容。不過,Unicode 資料的排序與 Windows 排序規則的特定版本相容。因為 SQL Server 定序對非 Unicode 和 Unicode 資料使用不同的比較規則,所以您會看到相同資料的比較有不同的結果,這取決於基礎資料類型而定。如需詳細資訊,請參閱<使用 SQL Server 定序>。[!附註]
當您升級 SQL Server 的英文執行個體時,可基於與 SQL Server 現有的執行個體相容而指定 SQL Server 定序 (SQL_*)。因為 SQL Server 執行個體的預設定序是在安裝期間定義,所以當下列條件成立時,一定要小心指定定序設定:
應用程式的程式碼視先前的 SQL Server 定序行為而定。
您將搭配現有的 SQL Server 6.5 或 SQL Server 7.0 安裝來使用 SQL Server 複寫。
您必須儲存反映多國語言的字元資料。
您可以在 SQL Server 執行個體的下列層級設定定序:
伺服器層級定序
預設定序是在 SQL Server 安裝期間設定,因此也會成為系統資料庫的預設定序。請注意,您無法在 SQL Server 安裝期間選取僅限 Unicode 定序,因為系統不支援將它們當做伺服器層級定序。當定序指派給資料行或資料庫以外的任何物件時,除非卸除及重新建立該物件,否則您不能變更此定序。若不變更 SQL Server 執行個體的預設定序,您可以在建立新資料庫或資料庫資料行時指定定序。
若要查詢 SQL Server 執行個體的伺服器定序,請使用下列 Transact-SQL SERVERPROPERTY 函數:
SELECT CONVERT (varchar, SERVERPROPERTY('collation'))
若要查詢伺服器的所有可用定序,請使用下列 fn_helpcollations() 內建函數:
SELECT * from ::fn_helpcollations()
資料庫層級定序
當建立資料庫時,您可以使用 CREATE DATABASE 陳述式的 COLLATE 子句來指定預設資料庫定序。如果未指定任何定序,資料庫就會被指派 model 資料庫的預設定序。model 資料庫的定序與 SQL Server 執行個體的預設定序相同。使用者資料庫的定序可以使用類似下面的 ALTER DATABASE 陳述式來變更:
ALTER DATABASE myDB COLLATE Greek_CS_AI
資料庫的目前定序可使用類似下面的陳述式來擷取:
SELECT CONVERT (varchar, DATABASEPROPERTYEX('database_name','collation'))
[!附註]
改變資料庫層級定序不會影響資料行層級或運算式層級的定序。
資料行層級定序
當您建立資料表時,可以使用 CREATE TABLE 陳述式的 COLLATE 子句來指定每個字元字串資料行的定序。若未指定任何定序,就會將資料庫的預設定序指派給此資料行。資料行的定序可以使用類似下面的 ALTER TABLE 陳述式來變更:
ALTER TABLE myTable ALTER COLUMN mycol NVARCHAR(10) COLLATE Greek_CS_AI
運算式層級定序
運算式層級定序是在執行陳述式時設定的,而且它們會影響傳回結果集的方式。這樣可讓 ORDER BY 將結果排序成地區設定特定的結果。使用類似下面的 COLLATE 子句來實作運算式層級定序:SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI
回到頁首
地區設定
地區設定是一組與某個地方或文化特性相關聯的資訊。這項資訊包括口語的名稱和識別碼、用來撰寫該語言的指令碼和文化習慣。定序可與一個或多個地區設定產生關聯。
回到頁首
Unicode
如果您儲存能夠反映多種語言的字元資料,一定要使用 Unicode 資料類型 (nchar、nvarchar 和 ntext) 而不要使用非 Unicode 資料類型 (char、varchar 和 text)。
重要限制會與非 Unicode 資料類型相關聯。這是因為非 Unicode 電腦受限於使用單一字碼頁。透過使用 Unicode,您可能會發現效能獲得明顯改善,因為所需要的字碼頁轉換減少。您必須在資料庫、資料行或運算式層級個別選取 Unicode 定序,因為伺服器層級不支援這些定序。
用戶端所使用的字碼頁是由作業系統設定決定。若要在 Windows 2000、Windows XP、Windows Server 2003 或 Windows Server 2008 作業系統上設定用戶端字碼頁,請使用 [控制台] 中的 [地區設定]。
當您將資料從伺服器移至用戶端時,舊版用戶端驅動程式可能無法辨識您的伺服器定序。這種問題可能會發生在您將資料從 Unicode 伺服器移至非 Unicode 用戶端的情況。此時,最佳選項可能就是升級用戶端作業系統,以便更新基礎系統定序。如果您的用戶端已經安裝了資料庫用戶端軟體,就可以考慮將服務更新套用至資料庫用戶端軟體。
此外,您也可以嘗試針對伺服器上的資料使用不同的定序。您可以選擇將會對應至用戶端字碼頁的定序。如需詳細資訊,請參閱《SQL Server 線上叢書》中的<設定和變更定序>主題。
若要評估與使用 Unicode 或非 Unicode 資料類型有關的議題,請測試自己的狀況,在您的環境中衡量效能差異。建議您將組織內系統上使用的定序標準化,並盡量部署 Unicode 伺服器和用戶端。如需有關 Unicode 的詳細資訊,請參閱 Unicode Consortium 網站 (英文)。
在許多情況下,SQL Server 將與其他伺服器或用戶端互動,而且您的組織可能會在應用程式與伺服器執行個體之間使用多重資料存取標準。SQL Server 用戶端是兩個主要類型的其中一種:
Unicode 用戶端,使用 OLE DB 和 Open Database Connectivity (ODBC) 3.7 版或更新版本。
非 Unicode 用戶端,使用 DB-Library 和 ODBC 3.6 版或更早版本。
下表將提供搭配 Unicode 和非 Unicode 伺服器的各種組合來使用多國語言資料的相關資訊。
伺服器 |
用戶端 |
好處或限制 |
---|---|---|
Unicode |
Unicode |
由於 Unicode 資料將在整個系統中使用,所以這個狀況可提供最佳效能,並防止所擷取的資料遭到損毀。這是 ActiveX Data Objects (ADO)、OLE DB 和 ODBC 3.7 版或更新版本的情況。 |
Unicode |
非 Unicode |
在此狀況中,特別是執行新版作業系統的伺服器與執行舊版 SQL Server 或在舊版作業系統上執行的用戶端之間存在連接,當您將資料移至用戶端電腦時,可能會有一些限制或錯誤。伺服器上的 Unicode 資料將嘗試對應至非 Unicode 用戶端上的對應字碼頁,以便轉換資料。 |
非 Unicode |
Unicode |
這不是使用多國語言資料的理想組態。您無法將 Unicode 資料寫入非 Unicode 伺服器。當資料傳送到在此伺服器的字碼頁以外的伺服器時,就可能發生問題。 |
非 Unicode |
非 Unicode |
這是多國語言資料的限制狀況。您只能使用單一字碼頁。 |
如果您將資料從伺服器移至用戶端 (亦即,從 Unicode 伺服器移至非 Unicode 用戶端) 時遇到錯誤或困難,表示舊版用戶端驅動程式可能無法辨識伺服器定序。在此情況下,最佳選項可能就是升級用戶端作業系統,以便更新基礎系統定序。如果您的用戶端已經安裝了資料庫用戶端軟體,就可以考慮將服務更新套用至資料庫用戶端軟體。
此外,您也可以嘗試針對伺服器上的資料使用不同的定序。您可以選擇將會對應至用戶端字碼頁的定序。如需有關變更定序的詳細資訊,請參閱《SQL Server 線上叢書》中的<在 SQL Server 中設定和變更定序>主題。如需有關變更定序的詳細資訊,請參閱<SQL Server 最佳作法:定序變更>白皮書 (英文)。如需有關將非 Unicode 資料類型移轉至 Unicode 的詳細資訊,請參閱<SQL Server 最佳作法:移轉至 Unicode>白皮書 (英文)。
相關主題:Unicode 基本概念
回到頁首
字碼頁
字碼頁是給定的指令碼的已排序字元集,其中每一個字元與數字索引或字碼指標值相關聯。Windows 字碼頁通常稱為「字元集」(Character Set) 或 charset。字碼頁是用來提供不同 Windows 系統地區設定所使用的字元集和鍵盤配置的支援。
所有 Windows Server 2008 Unicode 定序都是以 Unicode 5.0 為基礎。
回到頁首
資料類型
資料類型是一種定義,可指定值的範圍、可對值執行的作業以及這些值儲存在記憶體的方式。定義資料類型可讓 SQL Server 以可預測的方式操作資料。非 Unicode 字元資料類型為 char、varchar 和 text。Unicode 資料類型為 nchar、nvarchar 和 ntext。我們建議您在應用程式中使用 Unicode 資料類型,尤其當您儲存能反映多種語言的字元資料時,更應該使用。
如需有關將非 Unicode 資料類型移轉至 Unicode 的詳細資訊,請參閱<SQL Server 最佳作法:移轉至 Unicode>白皮書 (英文)。
相關主題:資料類型 (Database Engine)、資料類型 (Transact-SQL)、Integration Services 資料類型
回到頁首