Sql-Server

我在哪裡可以找到排序規則的確切規則?

  • February 6, 2020

Windows(SQL Server)中的排序規則定義的確切排序/相等規則是否有任何文件,例如“Finnish_Swedish_CI_AS”?

我知道 CI/CS、AI/AS 等,但我正在尋找一個表格或一組規則,這些規則實際上表明“a”在“b”之前排序等等。也許類似於此頁面:http ://collat​​ion-charts.org/mssql/mssql.040B.1252.Finnish_Swedish_CI_AS.html 該頁面的問題是我不清楚如何閱讀它的某些方面。此外,它並不表示 æ 被視為等於“ae”,我想知道是否還有更多此類情況或其他未顯示的規則。

另外,我試圖找出 Finnish_Swedish_CI_AS 和 Finnish_Swedish_100_CI_AS 之間的確切區別

不幸的是,不存在這樣的文件。最可能的原因是,由於規則的實際複雜性,記錄起來比大多數人意識到的要困難得多。雖然每個字元都有一個預設權重(即使該權重為 0),但如何使用該權重是由幾層規則決定的。其中一些規則依賴於排序規則(例如,大小寫、重音、假名和寬度敏感度),而一些規則只是硬編碼的(例如,在大多數但不是全部情況下,將小寫字母排序在大寫字母之前)。但是這些類型的規則只是被處理的一些規則類型。

是的,有簡單的æ=映射ae,但還有更複雜的涉及組合字元的映射(不單獨顯示的字元,而是疊加在基本字元之上)。例如:

SELECT NCHAR(252), NCHAR(0x0308), N'u' + NCHAR(0x0308)
-- ü    ̈   ü

IF (NCHAR(252) = N'u' + NCHAR(0x0308)) SELECT 'Same!' ELSE SELECT 'Nope.';
-- Same!

IF (NCHAR(252) = N'u') SELECT 'Same!' ELSE SELECT 'Nope.';
-- Nope.

IF (NCHAR(252) = N'u' COLLATE Latin1_General_100_CI_AI) SELECT 'Same!' ELSE SELECT 'Nope.';
-- Same!

當然,有些“字元”是由一個基本字元和多個組合字元組成的。

此外,某些權重取決於上下文(即角色相對於其他角色的放置位置)。例如,連字元(即 == 減號 == -)本身排在字母之前。一個簡單的測試顯示了這種行為:

SELECT * FROM (VALUES ('a'), ('c'), ('-')) t(c)
ORDER BY t.c COLLATE SQL_Latin1_General_CP1_CI_AS ASC;

SELECT * FROM (VALUES ('a'), ('c'), ('-')) t(c)
ORDER BY t.c COLLATE Latin1_General_CI_AS ASC;

兩個排序規則在這裡具有相同的順序:

-
a
c

現在讓我們在一些字母之間放置連字元。首先,我們將使用 SQL Server 排序規則進行測試(它使用較舊、更簡單的“字元串排序”):

SELECT * FROM (VALUES ('a'), ('c'), ('-'), ('aaa'), ('aca'), ('a-b'), ('a-d')) t(c)
ORDER BY t.c COLLATE SQL_Latin1_General_CP1_CI_AS ASC;

返回:

-
a
a-b
a-d
aaa
aca
c

這裡沒有區別,-仍然在字母之前,這就是為什麼兩a-行都在aa和之前ac。現在使用 Windows 排序規則:

SELECT * FROM (VALUES ('a'), ('c'), ('-'), ('aaa'), ('aca'), ('a-b'), ('a-d')) t(c)
ORDER BY t.c COLLATE Latin1_General_CI_AS ASC;

返回:

-
a
aaa
a-b
aca
a-d
c

您在這裡看到的是,由於位於字母之間,連字元被忽略(是的,它僅在排序時被忽略;在進行比較時,它不會被忽略,可以通過執行看到:)SELECT 1 WHERE 'a-b' = 'ab' COLLATE Latin1_General_CI_AS;。這就是為什麼在它被視為存在的情況下a-b排序,然後aaa在它被aca視為存在的情況下進行排序。ab``a-d``aca``ad

另外兩個複雜的因素是:

  • 正在使用哪些版本的 Unicode 字元數據庫 (UCD) 和通用區域設置數據儲存庫 (CLDR)。它不像一個(或許多)人希望的那麼簡單,舊版本的 Unicode 標準要麼似乎沒有所有的基本資訊,要麼至少它們確實不容易找到
  • Microsoft 對 Unicode 標準的實施有多精確?畢竟,它只是一個標準,可以由不同的供應商以不同的方式實施。

話雖如此,通過檢查 Unicode.org 的一些基本數據文件,您仍然可能非常接近您正在尋找的內容。但首先,我們需要知道要查看哪個特定於語言環境的自定義文件。我們可以通過獲取相關排序規則的 LCID 來找到它:

SELECT COLLATIONPROPERTY('Finnish_Swedish_CI_AS', 'LCID'),
      CONVERT(VARBINARY(3), COLLATIONPROPERTY('Finnish_Swedish_CI_AS', 'LCID'));
-- 1035       0x00040B

現在我們可以040B在以下頁面上查找:LCID 結構

我們看到它0x040B指的是fi-FI,這意味著我們將尋找一個文件名中的一個fi-FI或只是一個fi

引用自:https://dba.stackexchange.com/questions/107383