MSSQL定序問題

MSSQL定序問題

在 Microsoft SQL Server (MSSQL) 中,定序(Collation)指的是一組規則,用於定義字符資料(例如文字和字串)的排序順序、大小寫規則以及字元比較的行為。MSSQL 中的定序包括了以下幾個方面:

  1. 排序順序(Sorting Order): 指定字符的排序順序,例如在排序字串時,是按照字母順序還是其他方式。
  2. 大小寫規則(Case Sensitivity): 指定字符比較時是否區分大小寫。
  3. 陳述規則(Accent Sensitivity): 指定字符比較時是否區分重音符號,例如是否將重音符號視為不同的字符。
  4. 特定字符的比較行為(Comparison Behavior): 指定特定字符之間的比較行為,例如某些語言中的特殊字符可能有不同的比較行為。

MSSQL 中的每個資料庫和每個欄位都可以有自己的定序設置。如果沒有明確指定定序,則系統將使用預設的定序進行比較。

定序在數據庫操作中至關重要,因為它直接影響到排序、比較和查詢的行為。因此,在跨多個資料庫或不同環境之間進行操作時,確保定序的一致性是非常重要的。

先查詢其中一個資料庫的定序, 通常是以主要SQL資料的DB

--SELECT DATABASEPROPERTYEX ('資料庫名稱' ,'Collation' )
SELECT DATABASEPROPERTYEX ('database1' ,'Collation' )

--查詢結果: Chinese_Taiwan_Stroke_CI_AS

調整SQL寫法

--將t2欄位轉換為與t1欄位相同定序
SELECT *
FROM database1.dbo.table1 AS t1
JOIN database2.dbo.table2 AS t2
ON t1.column = t2.column COLLATE Chinese_Taiwan_Stroke_CI_AS;

--或者同時轉換為相同定序
SELECT *
FROM database1.dbo.table1 AS t1
JOIN database2.dbo.table2 AS t2
ON t1.column COLLATE Chinese_Taiwan_Stroke_CI_AS = t2.column COLLATE Chinese_Taiwan_Stroke_CI_AS;

通常使用這種寫法解決定序問題, 都會有執行效能問題。

留言

這個網誌中的熱門文章

ORA-12514: TNS: 監聽器目前不知道連線描述區中要求的服務

Oracle 例外控制(Exception Control)

Oracle 工作排程 DBMS_JOB 筆記