SQL Server 資料庫引擎與 Analysis Services (SSAS) 可獨立設定排序規則,但兩者不一致會導致查詢結果排序、比較、分組行為差異,進而造成報表不一、ETL 失敗、使用者困惑。本文深度分析兩者支援的排序規則體系、不一致風險、選擇決策矩陣 (二進位、Windows、SQL Server 三大類)、實務建議與驗證腳本。
| 引擎 | 支援排序規則類型 | 預設行為 |
|---|---|---|
| SQL Server Database Engine | 1. Windows Collations (依作業系統地區設定) 2. SQL Server Collations (舊版相容,如 SQL_Latin1_General_CP1_CI_AS) | 英文環境安裝預設 SQL Server Collation;中文/非英文環境預設 Windows Collation (如 Chinese_Taiwan_Stroke_CI_AS) |
| Analysis Services (SSAS) | 僅支援 Windows Collations | 強制 Windows Collation |
ORDER BY 結果順序不一,導致報表呈現差異。WHERE Col = 'value'、GROUP BY Col、DISTINCT、JOIN 條件在大小寫、重音、全半形、寬窄字元敏感度上判斷不同。NCHAR/NVARCHAR (Unicode) 與 CHAR/VARCHAR (非 Unicode) 比較規則不同,混用時結果易混淆。Latin1_General_100_BIN2 或 Chinese_Taiwan_Stroke_90_BIN2。NCHAR/NVARCHAR (Unicode) 與 CHAR/VARCHAR (非 Unicode),且應用程式需跨類型比較/聯結。CHAR/VARCHAR,且極少使用 LIKE 模糊查詢 (Windows Collation 對 LIKE 優化較弱,見下)。Chinese_Taiwan_Stroke_CI_AS → Chinese_Taiwan_Stroke_100_CI_AS),包含增補字元支援、權重表更新。LIKE、PATINDEX、CHARINDEX 等模式比對在大量資料時效能優於 Windows Collation (特別是前綴搜尋 LIKE 'abc%')。LIKE 'prefix%' 且已建立索引,經實測 Windows Collation 明顯較慢 (罕見,需實測驗證)。開始 │ ├─ 是否部署 SSAS 且要求結果一致? ──是──→ 強制選 Windows Collation (_100 系列) → 結束 │ ├─ 資料是否純機器處理、無人類排序需求、單一字元類型? ──是──→ 選 Binary2 (BIN2) → 結束 │ ├─ 是否大量使用 LIKE 'prefix%' 且經實測 Windows Collation 顯著較慢? ──是──→ 評估 SQL Server Collation (風險自負) → 結束 │ └─ 預設選擇 → Windows Collation (_100 系列,依地區選 Chinese_Taiwan_Stroke_100_CI_AS 等) → 結束
-- 資料庫預設
SELECT name, collation_name FROM sys.databases WHERE name = 'YourDB';
-- 資料行層級
SELECT name, collation_name FROM sys.columns
WHERE object_id = OBJECT_ID('YourTable') AND collation_name IS NOT NULL;
ALTER DATABASE YourDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE YourDB COLLATE Chinese_Taiwan_Stroke_100_CI_AS;
ALTER DATABASE YourDB SET MULTI_USER;
ALTER TABLE YourTable ALTER COLUMN ColName NVARCHAR(100) COLLATE Chinese_Taiwan_Stroke_100_CI_AS;
排序規則是資料庫行為的基因,選對了事半功倍,選錯了處處是坑。請在架構設計階段納入決策流程,避免上線後被迫痛苦變更。