程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> SQL Server的排序規則(collation)沖突和解決方案

SQL Server的排序規則(collation)沖突和解決方案

編輯:關於MYSQL數據庫

       什麼是排序規則(collation)

      關於SQL Server的排序規則,估計大家都不陌生,在創建數據庫時我們經常要選擇一種排序規則(conllation),一般我們會留意到每一種語言的排序規則都有許多種,比如標准大陸簡體中文Chinese_PRC的排序規則就有數十種之多。

    SQL Server的排序規則(collation)沖突和解決方案  三聯

      這些排序規則有什麼作用呢?讓我們先來看看MS官方的解釋:

      排序規則指定了表示每個字符的位模式。它還指定了用於排序和比較字符的規則。排序規則具有下面的特征:

      語言

      區分大小寫

      區分重音

      區分假名

      比如在SQL Server 2005中,排序規則名稱由兩部份構成,比如 Chinese_PRC_CI_AI_WS

      前半部份是指本排序規則所支持的字符集,如Chinese_PRC 指針對大陸簡體字UNICODE的排序規則。

      後半部份即後綴的含義如下:

    _BIN                 指定使用向後兼容的二進制排序順序。 _BIN2      指定使用 SQL Server 2005 中引入的碼位比較語義的二進制排序順序。 _Stroke   按筆劃排序 _CI(CS) 是否區分大小寫,CI不區分,CS區分 _AI(AS) 是否區分重音,AI不區分,AS區分 _KI(KS) 是否區分假名類型,KI不區分,KS區分 _WI(WS) 是否區分全半角,WI不區分,WS區分

      既然排序規則如此復雜,那麼應用了不同排序規則的列之間默認情況下便不能進行Union、Join、Like等equal操作了,於是便有了排序規則(collation)沖突。

      排序規則(collation)沖突。

      我們知道,SQL Server 從2000 開始,便支持多個排序規則。SQL Server 2000 的數據庫可使用除默認排序規則以外的其他排序規則。此外,SQL Server 2000 還支持為列專門制定排序規則。

      這樣一來,我們在寫跨表、跨數據庫、跨服務器操作的T-SQL時,如果equal的字段排序規則不同,便會發生排序規則沖突。

      比如我們先見兩個結構相同的表,但字段的排序規則不同:

      Copy to Clipboard

      -- 1. Create TableA.

      CREATE TABLE TagsTableA

      (

      TagName NVARCHAR(64) COLLATE Chinese_PRC_BIN

      )

      -- 2. Create TableB.

      CREATE TABLE TagsTableB

      (

      TagName NVARCHAR(64) COLLATE Chinese_PRC_CI_AS

      )

      當表建好之後執行:

      Copy to Clipboard

      -- 3. Try to join them

      SELECT * from TagsTableA A INNER JOIN TagsTableB B on A.TagName = B.TagName

      便會出下類似下面的問題:

      無法解決 equal to 操作中 "Chinese_PRC_BIN" 和 "Chinese_PRC_CI_AS" 之間的排序規則沖突。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved