我在哪裡可以找到排序規則的確切規則?
Windows(SQL Server)中的排序規則定義的確切排序/相等規則是否有任何文件,例如“Finnish_Swedish_CI_AS”?
我知道 CI/CS、AI/AS 等,但我正在尋找一個表格或一組規則,這些規則實際上表明“a”在“b”之前排序等等。也許類似於此頁面:http ://collation-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
。
解釋(一些“輕”讀;-):
數據:
- 轉換(
æ → ae
等)- 重新映射的 Unicode 元素表以用於 CLDR
- 根整理順序
- 芬蘭語定制(基於
1035
/0x040B
表示“fi”的 LCID)