字碼頁 對於字元和 Unicode 資料的位元模式的定義,此模式代表特定字母、數字或符號(例如 0x20 代表一個空格,而 0x74 代表字元“t”)。一些資料類型每個字元使用一個位元組;每個位元組可以具有 256 個不同的位元模式中的一個模式。
在電腦中,字元由不同的位元模式(ON 或 OFF)表示。每個位元組有 8 位,這 8 位可以有 256 種不同的 ON 和 OFF 組合模式。對於使用 1 個位元組儲存每個字元的程式,通過給每個位元模式指派字元可表示最多 256 個不同的字元。2 個位元組有 16 位,這 16 位可以有 65,536 種唯一的 ON 和 OFF 組合模式。使用 2 個位元組表示每個字元的程式可表示最多 65,536 個字元。
單位元組字碼頁是字元定義,這些字元對應表到每個位元組可能有的 256 種位元模式中的每一種。字碼頁定義大小寫字元、數字、符號以及 !、@、#、% 等特殊字元的位元模式。每種歐洲語言(如德語和西班牙語)都有各自的單位元組字碼頁。雖然用於表示 A 到 Z 拉丁字母表字元的位元模式在所有的字碼頁中都相同,但用於表示重音字元(如"é"和"á")的位元模式在不同的字碼頁中卻不同。如果在運行不同字碼頁的電腦間交換資料,必須將所有字元資料由發送電腦的字碼頁轉換為接收電腦的字碼頁。如果來源資料中的擴充字元在接收電腦的字碼頁中未定義,那麼資料將丟失。如果某個資料庫為來自許多不同國家的用戶端提供服務,則很難為該資料庫選擇這樣一種字碼頁,使其包括所有用戶端電腦所需的全部擴充字元。而且,在字碼頁間不停地轉換需要花費大量的處理時間。
僅靠單一位元組字元集儲存許多語言所使用的字元也是不夠的。例如,一些亞洲語言套件含上千個字元,所以每個字元必須使用雙位元組。雙位元組字元集正是為這些語言定義的。但是,這些語言都有各自的字碼頁,在運行不同雙位元組字碼頁的電腦之間傳輸資料也存在困難。
SQL Server 2000 支援以下字碼頁。
字碼頁 描述
1258 越南語
1257 波羅的語
1256 阿拉伯語
1255 希伯來語
1254 土耳其語
1253 希臘語
1252 拉丁 1 字元 (ANSI)
1251 西裡爾語
1250 中歐語言
950 繁體中文
949 朝鮮語
936 簡體中文
932 日語
874 泰國語
850 多語種 (MS-DOS Latin1)
437 MS-DOS 美國英語
為解決在網路中支援多種字碼頁時出現的字元轉換和解釋問題,ISO 標準化組織和稱為 Unicode Consortium 的團體定義了 Unicode 標準。Unicode 使用雙位元組儲存每個字元。由於 65,536 個字元足以涵蓋世界上所有語言常用的字元,因此 Unicode 標準適用於所有的主要語言。如果網路中的所有電腦和程式都使用 Unicode,則無需進行任何字元轉換,每個使用者與所有其它使用者看到的字元完全相同,並且不會丟失任何字元。
在運行 Microsoft Windows® 作業系統的電腦上,作業系統和 Windows 應用程式使用的字碼頁由 Windows 地區設定定義。地區設定是在安裝作業系統時選擇的。Windows 應用程式使用由 Windows 地區設定定義的字碼頁來解釋資料。Windows 應用程式還支援寬字元資料,即 Unicode 資料。
SQL Server 2000 支援兩類字元資料類型:
Unicode 資料類型 nchar、nvarchar 和 ntext。這些資料類型使用 Unicode 字元標記法。字碼頁不適用於這些資料類型。
非 Unicode 字元資料類型 char、varchar 和 text。這些資料類型使用單位元組或雙位元組字碼頁中定義的字元標記法。
有關字元資料的儲存方式以及字碼頁、Unicode 和排序次序操作的更多資訊,請參見在 http://msdn.microsoft.com MSDN® 頁中的 Developing International Software for Windows 95 and Windows NT 4.0。
國際化資料和 Unicode
當只使用字元資料和字碼頁時,在一個資料庫內很難以多種語言儲存資料。很難為資料庫找到一種字碼頁,能夠儲存所需全部語言特有的字元。對於運行各種字碼頁的不同用戶端所讀取和更新的特殊字元,要確保正確地轉換也很困難。支援國際化用戶端的資料庫應始終使用 Unicode 資料,而不應使用非 Unicode 資料類型。
例如,北美洲客戶的資料庫必須處理三種主要語言:
墨西哥使用的西班牙文名稱和地址。
魁北克使用的法文名稱和地址。
加拿大的其餘地區和美國使用的英文名稱和地址。
當只使用字元列和字碼頁時須小心,以確保資料庫所安裝的字碼頁能夠處理這三種語言的字元。當其中一種語言的字元由運行另一種語言的字碼頁的用戶端讀取時,必須更加小心以確保能夠正確轉換字元。
隨著 Internet 的發展,支援眾多運行不同地區設定的用戶端電腦變得日益重要。很難選擇這樣一種字碼頁,使其包含的字元資料類型能夠支援全球範圍使用者所需的全部字元。
管理國際化資料庫中的字元資料的最簡單方法是始終使用 Unicode nchar、nvarchar 和 ntext 資料類型,代替對應的非 Unicode 資料類型(char、varchar 和 text)。如果所有使用國際化資料庫的應用程式也採用 Unicode 變數而不是非 Unicode 變數,那麼在系統中的任何地方都無須進行字元轉換。每個用戶端與所有其它用戶端看見的字元資料都完全相同。
對於可使用單位元組字碼頁的系統,Unicode 資料需要的儲存空間是非 Unicode 字元資料的兩倍,但卻消除了在字碼頁間轉換擴充字元的必要,因此至少部分彌補了上面的不足。使用雙位元組字碼頁的系統沒有這個問題。
SQL Server 2000 將所有的文本化系統目錄資料都儲存在包含 Unicode 資料類型的列中。資料庫物件(如表、視圖和預存程序)的名稱儲存在 Unicode 列中。這樣就可以只使用 Unicode 開發應用程式,從而避免了所有的字碼頁轉換問題。
排序次序
排序次序指定 SQL Server 解釋、排序、比較和顯示字元資料所使用的規則。例如,排序次序定義"a"是小於、等於還是大於"b"。排序次序定義定序是否區分大小寫,例如"m"和"M"是否相同。另外還定義定序是否區分重音,例如"á"和"ä"是否相同。
SQL Server 2000 對每種定序使用兩種排序次序,一種用於 Unicode 資料,另一種用於字元字碼頁。
許多 SQL Server 定序使用相同的字碼頁,但是字碼頁的排序次序不同。這使網站得以選擇:
是否僅根據位元模式所表示的數字值來排序字元。二進位排序的速度最快,這是因為 SQL Server 不用做任何調整並可使用快速、簡單的排序演算法。二進位排序次序始終區分大小寫。由於字碼頁中的位元模式可能不按照特定語言的字典規則所定義的序列排列,二進位排序有時並不按照使用該語言的使用者所期待的序列對字元進行排序。通過上面的材料可以看出,字碼頁就是各個國家和地區的字元集,字元的位表示。資料庫中見到的:collate chinese_prc_ci_as null 下面轉自 求是的部落格
我們在create table時經常會碰到這樣的語句,例如:CorpName nvarchar(10) collate chinese_prc_ci_as null,那它到底是什麼意思呢?
不妨看看下面:
文法
COLLATE < collation_name >
< collation_name > ::=
{ Windows_collation_name } | { SQL_collation_name }
參數
collation_name
是應用於運算式、列定義或資料庫定義的定序的名稱。collation_name 可以只是指定的 Windows_collation_name 或 SQL_collation_name。
Windows_collation_name
是 Windows 定序的定序名稱。
SQL_collation_name
是 SQL 定序的定序名稱。
注釋
COLLATE 子句可以在幾個層級上指定,包括以下層級:
- 建立或更改資料庫。
可以使用 CREATE DATABASE 或 ALTER DATABASE 語句的 COLLATE 子句指定資料庫的預設定序。還可在建立資料庫時使用 SQL Server 企業管理器指定定序。如果不指定定序,則將為資料庫指派 SQL Server 執行個體的預設定序。
- 建立或更改表列。
可以使用 CREATE TABLE 或 ALTER TABLE 語句的 COLLATE 子句指定每個字串列的定序。還可在建立表時使用 SQL Server 企業管理器指定定序。如果不指定定序,將為列指派資料庫的預設定序。
還可使用 COLLATE 子句中的 database_default 選項,指定暫存資料表中的列使用串連的目前使用者資料庫(而不是 tempdb)的預設定序。
- 投影運算式的定序。
可以使用 COLLATE 子句將字元運算式投影到特定的定序。將為字元字面值和變數指派當前資料庫的預設定序。將為列引用指派列的定義定序。
標識符的定序取決於定義標識符時所在的層級。為執行個體級對象(如登入名稱和資料庫名)的標識符指派執行個體的預設定序。為資料庫物件(如表、視圖和列名)的標識符指派資料庫的預設定序。例如,對於名稱差別僅在於大小寫兩個表,可在使用區分大小寫定序的資料庫中建立,而不能在使用不區分大小寫定序的資料庫中建立。
當串連上下文與資料庫相關時,可以建立變數、GOTO 標籤、暫存預存程序和暫存資料表,且當已將環境切換到其它資料庫時引用它們。變數、GOTO 標籤、暫存預存程序和暫存資料表的標識符在執行個體的預設定序中。
COLLATE 子句只能應用於 char、varchar、text、nchar、nvarchar 和 ntext 資料類型。
下面簡單介紹一下定序:
什麼叫定序呢?MS是這樣描述的:"在 Microsoft SQL Server 2000 中,字串的實體儲存體由定序控制。定序指定表示每個字元的位元模式以及儲存和比較字元所使用的規則。"
定序一般由定序名標識。例外情況是:在安裝過程中沒有為 Windows 定序指定定序名稱,而是指定定序指標,然後選擇複選框以指定區分或不區分大小寫和重音的二進位排序或字典排序。
可以執行系統函數 fn_helpcollations 以檢索 Windows 定序和 SQL 定序的所有有效定序名稱的列表:
SELECT * FROM ::fn_helpcollations()
SQL Server 只支援由基礎作業系統支援的字碼頁。當執行依賴定序的操作時,被引用對象所使用的 SQL Server 定序必須使用電腦上啟動並執行作業系統所支援的字碼頁。這些操作可包括:
<!--[if !supportLists]-->· <!--[endif]-->當建立或更改資料庫時,為資料庫指定預設定序。
<!--[if !supportLists]-->· <!--[endif]-->當建立或更改表時,為列指定預設定序。
<!--[if !supportLists]-->· <!--[endif]-->當還原或附加資料庫時,作業系統必須支援資料庫的預設定序,並支援資料庫中的任何 char、varchar 和 text 列或參數的定序。
支援 char 和 varchar 資料類型的字碼頁轉換,但是不支援 text 資料類型的字碼頁轉換。不報告字碼頁轉換過程中的資料丟失。
如果被引用的對象所使用或指定的定序使用 Windows 不支援的字碼頁,則 SQL Server 將發出錯誤資訊。有關更多資訊,請參見 SQL Server 聯機叢書的"SQL Server 構架"章中的"定序"節。
定序名稱由兩部份構成,前半部份是指本定序所支援的字元集。
如: Chinese_PRC_CS_AI_WS
前半部份:指UNICODE字元集,Chinese_PRC_指標對大陸簡體字UNICODE的定序。
定序的後半部份即尾碼 含義:
_BIN 二進位排序
_CI(CS) 是否區分大小寫,CI不區分,CS區分
_AI(AS) 是否區分重音,AI不區分,AS區分
_KI(KS) 是否區分假名類型,KI不區分,KS區分
_WI(WS) 是否區分寬度 WI不區分,WS區分
區分大小寫:如果想讓比較將大寫字母和小寫字母視為不等,請選擇該選項。
區分重音:如果想讓比較將重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,比較還將重音不同的字母視為不等。
區分假名:如果想讓比較將片假名和平假名日語音節視為不等,請選擇該選項。
區分寬度:如果想讓比較將半形字元和全形字元視為不等,請選擇該選項
文法
< SQL_collation_name > :: =
SQL_SortRules[_Pref]_CPCodepage_<ComparisonStyle>
<ComparisonStyle> ::=
_CaseSensitivity_AccentSensitivity | _BIN
參數
SortRules
標識字母表或語言的字串,當指定按字典排序時應用該字母表或語言的定序。例如 Latin1_General 或波蘭語。
Pref
指定大寫字母優先。
Codepage
指定標識定序所使用的字碼頁的 1 至 4 個數位號碼。CP1 指定字碼頁 1252,對於所有其它字碼頁指定完整字碼頁號碼。例如,CP1251 指定字碼頁 1251,CP850 指定字碼頁 850。
CaseSensitivity
CI 指定不區分大小寫,CS 指定區分大小寫。
AccentSensitivity
AI 指定不區分重音,AS 指定區分重音。
BIN
指定使用二進位排序次序。