SQL Server 定序設定 (以簡訊平台為例)

SQL Server 定序設定

SQL Server定序設定

最近在處理各簡訊平台的聯絡人群組的問題,當一切都完成部屬正式上線後發現,為什麼群組的排序不一樣?程式碼翻了又翻,怎麼都找不到問題,SQL指令明明都一樣,為什麼偏偏就是正式機上的排序怪怪的,找了半天才發現測試機的資料定序設定跟正式機上的不一樣,才恍然大悟。所以今天要跟各位介紹關於 SQL Server 定序的設定,以及其參數代表的意義。

A.      參數及設定

如下圖所示在新增資料庫的同時就可進行定序的設定或點選資料庫的屬性業也可以看到相同的設定,但是其中的定序設定選項多到讓人頭痛,以下我就介紹其設定的相關意義。

SQL Server定序設定 SQL Server定序設定

其定義可以以底線做欄位區分,分別定義其的意義。

例如 Chinese_Taiwan_Bopomofo_CI_AI_KS_WS;其中Chinese_Taiwan_Bopomofo為地區及排序法。

以Chinese開頭可能就有Chinese_Taiwan、Chinese_Hongkong、Chinese_Traditional、Chinese _Simplified等等。

再來Bopomofo(ㄅㄆㄇㄈ)是排序法,意義就是依照注音去排序,另外也有Pinyin(拼音)就會照著,拼音的英文字母排序。

再來就是一些代號的定義:

  1. Case-CS (Case sensitivity)/ CI (Case Insensitive)

此為區分大小的設定,就如字面意思,CS代表大小寫視為相異,CI代表大小寫視為相同,這個設定對於在Select資料來說非常的重要,所以當查不到資料的時候要記得先確認定序的Case設定。

  1. Accent-AS(Accent sensitivity)/AI(Accent Insensitive)

這個設定對我來說比較不知道差異在哪,微軟的解釋是腔調上的差異,例如a跟á、o跟ó在腔調是一樣的,所以可以設定是否要忽略,概念上是發音相同的字母是不是要視為相異字的設定。

  1. Kana-KS(Kana Sensitivity)/KI(Kana Insensitive)

日文中的片假名(Hiragana)與平假名(Katakana)的差異設定,這個就比較少用到了,所也不多做描述。

  1. Width-WS(Width sensitivity)/WI(Width Insensitive)

全形字與半形字的差異設定,這個設定對資料Select真的滿重要的,滿常會遇到使用者習慣用全形的標點,或是全形的阿拉伯數字做查詢,所以要看系統設計是不是要允許相容全形或半形字。

  1. BIN、BIN2

這個設定比較特殊,主要是針對非Unicode的資料,效能會優於以上幾種定序,它的運作規則是,當資料都非Unicode的資料,會自動以ANSI CODE排序, 但當資料是含有Unicode的資料就會依照上述Case、Accent、Kana、Width的規則去做排序。

至於BIN與BIN2的差別,以微軟說法是在 BIN2 定序中,所有字元都是根據其字碼指標排序,效能較好;在 BIN 定序中,只有第一個字元是根據字碼指標排序,剩餘字元則是根據其位元組值排序,所以在排序時效能會略差。

B.      補充說明

定序的設定,也可以在下SQL的同時使用,例如:

SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI

可能在有些時候需要特殊的條件排序,就可以直接下在ORDER BY 之後,可以省掉一些麻煩。

 

C.       參考資料

  1. https://docs.microsoft.com/zh-tw/sql/relational-databases/collations/collation-and-unicode-support#Code_Page_Defn
  2. https://docs.microsoft.com/zh-tw/sql/relational-databases/collations/set-or-change-the-database-collation
  3. https://docs.microsoft.com/zh-tw/sql/relational-databases/collations/set-or-change-the-column-collation
  4. https://docs.microsoft.com/zh-tw/sql/relational-databases/databases/contained-database-collations

 

Comments

No comments yet. Why don’t you start the discussion?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料