天天看點

MS SQL 排序規則總結

排序規則術語

什麼是排序規則呢? 排序規則是根據特定語言和區域設定标準指定對字元串資料進行排序和比較的規則。SQL Server

支援在單個資料庫中存儲具有不同排序規則的對象。MSDN解釋:在 Microsoft SQL

Server中,字元串的實體存儲由排序規則控制。排序規則指定表示每個字元的位模式以及存儲和比較字元所使用的規則

Transact-SQL

語句在具有不同排序規則設定的不同資料庫上下文中運作時,其運作結果可能會不同。如果可能,請為您的組織使用标準化排序規則。我管理的資料庫當中,一般情

況下,中國區域設定為Chinese_PRC_CI_AS,國外一般設定SQL_Latin1_General_CP1_CI_AS。這樣就不必顯式指定

每個字元或 Unicode 表達式中的排序規則。如果必須使用具有不同排序規則和代碼頁設定的對象,請對查詢進行編碼,以考慮排序規則的優先順序規則。

排序規則指定了表示每個字元的位模式。它還指定了用于排序和比較字元的規則。排序規則的特征是區分語言、區分大小寫、區分重音、區分假名以及區分全半角。如下所示:

Chinese_PRC_CI_AS   前半部份:指UNICODE字元集,Chinese_PRC_指針對大陸簡體字UNICODE的排序規則,CI表示不區分大小寫,AS表示區分重音。

排序規則的後半部份即字尾 含義:

_BIN         指定使用向後相容的二進制排序順序。

_BIN2        指定使用 SQL Server 2005 中引入的碼位比較語義的二進制排序順序。

_Stroke      按筆劃排序

_CI(CS)      是否區分大小寫,CI不區分,CS區分(case-insensitive/case-sensitive)

_AI(AS)      是否區分重音,AI不區分,AS區分(accent-insensitive/accent-sensitive)

_KI(KS)      是否區分假名類型,KI不區分,KS區分(kanatype-insensitive/kanatype-sensitive)

_WI(WS)      是否區分全半角, WI不區分,WS區分(width-insensitive/width-sensitive)

區分大小寫:如果想讓比較将大寫字母和小寫字母視為不等,請選擇該選項。

區分重音:如果想讓比較将重音和非重音字母視為不等,請選擇該選項。如果選擇該選項,比較還将重音不同的字母視為不等。

區分假名:如果想讓比較将片假名和平假名日語音節視為不等,請選擇該選項。

區分寬度:如果想讓比較将半角字元和全角字元視為不等,請選擇該選項。

檢視資料庫支援哪些排序規則可以通過下面系統函數檢視:

排序規則類型

SQL Server 提供了兩組排序規則:Windows 排序規則和 SQL Server 排序規則。具體參考MSDN,這裡不做過多贅述。

檢視伺服器排序規則(資料庫執行個體排序規則)

檢視資料庫排序規則

檢視列排序規則

SQL 1:

修改伺服器排序規則

      修改伺服器的排序規則的原因千差萬别,大部分情況是由于安裝的時候,忽略了伺服器排序規則這個選項設定,沒有事前規劃好,等到将資料庫還原或遷移到新伺服器上,測試過程中才發現問題。

修改伺服器排序規則,其實就是按指定排序規則重新

生成 master、model、msdb 和 tempdb

等系統資料庫,修改伺服器排序規則中,首先删除這些系統資料庫,然後在預設位置按指定排序規則重新建立。

修改資料庫執行個體排序規則時,由于删除、重建系統資料庫。 使用者對這些資料庫所做的所有修改都會丢失。

例如,賬号資訊、作業、連結伺服器等等。是以修改伺服器排序規則要慎重,首先做好備份或整理相關賬号、作業、連結伺服器、郵件配置資訊等。以免倉促造成不

必要的麻煩或損失。

MSDN關于設定和更改伺服器排序規則

SQL 2005

SQL 2008

MS SQL 排序規則總結

伺服器排序規則修改起來看似很簡單,其實不然,一不小心,就會讓你萬劫不複。我在實踐中就碰到過一次疏忽了某個步驟,結果讓我驚出一身冷汗。下面是我自己實施的步驟:

Step 1: 首先備份資料庫(包括系統資料庫和使用者資料庫)。記得千萬不要漏掉了系統資料庫備份。有備才能無患,否則每一步操作,你總要提心吊膽。

Step 2:

在文檔上記錄下你修改過的一些伺服器配置值。例如,在SQL SERVER 2008中,你有可能啟用backup compression

default ;在某個32位資料庫開啟了awe enabled

選項,那麼修改伺服器排序規則後,你需要重新應用、配置這些值。以免遺漏,導緻資料庫性能等問題。

Step 3:記錄一下系統資料庫的資料檔案和日志檔案的所在路徑。 重新生成系統資料庫會将所有系統資料庫安裝到其原位置。 如果你沒有移動過系統資料庫資料庫檔案或日志檔案,這一步可以忽略,像很多時候,為了I/O性能等原因,可能移動過這些系統資料庫檔案和日志檔案。

Step 4: 用文檔将登入名(logins)和相關密碼整理出來。因為修改伺服器排序規則,實則重建系統資料庫master、msdb、tempd等,登入名等資訊會全部沒有,需要重新建立、配置。

Step 5: 生成已有作業的SQL腳本。友善修改伺服器排序規則後,重新建立、部署作業。道理同上。

Step 6: 生成已有連結伺服器的排序規則,友善修改伺服器排序規則後,重新建立、部署連結伺服器。道理同上。

Step 7: 整理一下資料庫郵件配置檔案和已經建立的賬号,友善修改伺服器排序規則後,重新配置。

Step 8: 如果在執行個體上有配置釋出—訂閱等,那麼也需要整理這些相關的腳本、文檔。

Step 9: 分離使用者建立的資料庫(這一步其實沒有必要)。

Step 10:修改伺服器排序規則

Step 11: 附加Step 9分離的資料庫。

Step 12:解決孤立賬号、配置作業、連結伺服器…..

當然,看似簡單的操作過程,其實在不同的環境下,你總會遇到一些意外情況

例1:

D:\軟體工具\SQL SERVER 2008>Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=M

SSQLSERVER /SQLSYSADMINACCOUNTS=sa /SAPWD=123456 /SQLCOLLATION=SQL_Latin1_General_CP1_CI_AS

Microsoft (R) SQL Server 2008

The following error occurred:

指定的 sa 密碼不滿足強密碼要求。有關強密碼要求的更多資訊,請參見安裝程式幫助或 SQL Server 2008 聯機叢書中的“資料庫引擎配置 - 帳戶設定”。

Error result: -2068578304

Result facility code: 1204

Result error code: 0

Please review the summary.txt log for further details

MS SQL 排序規則總結

這個需要你修改sa的密碼,滿足強密碼要求就可解決這個問題。

例2: 不小心将/SAPWD中間多了幾個空格,結果報如下錯誤。

MS SQL 排序規則總結

例3:附加資料庫時,沒有用sa賬号,而是用sa建立的windows 身份登入驗證賬号附加資料庫,結果報如下錯誤,改用sa賬号附加,問題解決

MS SQL 排序規則總結

另外以前也碰到過兩個異常情況,一下子很難重制,以後遇到在補上。

MS SQL 排序規則總結

另外執行上面腳本時,有可能時間比較長,此時你有

沒啥提示,這時千萬不要驚慌,耐心等待,如果你想了解進度,可以通過檢視相關日志檔案來檢視進度,日志資訊一般位于C:\Program

Files\Microsoft SQL Server\100\Setup Bootstrap\Log\ 下,例如C:\Program

Files\Microsoft SQL Server\100\Setup Bootstrap\Log\20130909_233902

修改資料庫排序規則

更改資料庫排序規則時,需要更改下列内容:

資料庫的預設排序規則,這一新的預設排序規則将應用于資料庫中後續建立的所有列、使用者定義的資料類型、變量和參數。根據資料庫中定義的對象解析 SQL 語句中指定的對象辨別符時,也使用新的預設排序規則。

将系統表中的任何 char、varchar、text、nchar、nvarchar 或 ntext 列更改為使用新的排序規則。

将存儲過程和使用者定義函數的所有現有 char、varchar、text、nchar、nvarchar 或 ntext 參數和标量傳回值更改為使用新的排序規則。

将 char、varchar、text、nchar、nvarchar 或 ntext 系統資料類型和基于這些系統資料類型的所有使用者定義的資料類型更改為使用新的預設排序規則。

方法1:

ALTER DATABASE DataBaseName  COLLATE  Chinese_PRC_CI_AS

此時雖然修改了資料庫的排序規則,但是先前使用者建立的表的排序規則不會改變,仍然是舊的排序規則,你可以用下面SQL腳本驗證。

有時候如果有其它會話連接配接到資料庫,你修改資料庫排序規則的時候,會報5030錯,如下所示:

此時你必須斷開其它會話,通常用下面步驟實作:

修改為單使用者模式

ALTER DATABASE  DataBaseName   SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ALTER DATABASE MESDB COLLATE  Chinese_PRC_CI_AS

修改為多使用者模式

ALTER DATABASE DataBaseName SET MULTI_USER

方法2:導出建立資料庫各類對象的腳本,然後替換相應的排序規則,這種方法适合丢棄資料,隻保留結構的方式,如果還要考慮資料,那麼是個複雜、繁瑣的實作方法。

修改列排序規則

ALTER TABLE TEST2 ALTER COLUMN NAME CHAR(120)  COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL

排序規則沖突

1:SQL 腳本使用臨時表時,出現下面錯誤(伺服器排序規則與資料庫排序規則不一緻)。

Cannot resolve the collation conflict between "Chinese_PRC_90_CI_AS" and "Chinese_PRC_CI_AS" in the equal to operation.

一般出現這種情況,通常通過顯示指定臨時表相關列的排序規則或在SQL 腳本裡面顯示指定排序規則解決。其本質是因為tempdb與使用者資料庫的排序規則不一緻導緻的。

2:兩台伺服器上的資料庫通過連結伺服器交換操作(或交換資料)時,由于排序規則,有可能導緻查詢語句超級慢,出現這個情況,是由于轉換時,導緻查詢計劃不走索引,走全表掃描所緻。