首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 全半角字符比較問題:排序規則 Width-Sensitive 詳解

     編輯:關於SqlServer

問題現象

實際項目中遇到:03BHL01001(上海)(全角括號)與 03BHL01001(上海)(半角括號)被判定為相同,導致主鍵衝突。

  • 全角括號 ( ASCII:0xA3A8
  • 半角括號 ( ASCII:0x28
  • 編碼明顯不同,但 SQL Server 認為相等

根因:排序規則的 Width-Insensitive(不區分寬度)

SQL Server 排序規則由四部分組成:

  1. 代碼頁
  2. 大小寫敏感
  3. 重音敏感
  4. 寬度敏感

默認安裝中文版 SQL Server 選擇 Chinese_PRC_CI_AS,全稱:

Chinese-PRC, Case-Insensitive, Accent-Sensitive, Kana-Type-Insensitive, Width-Insensitive

Width-Insensitive 導致單字節(半角)與雙字節(全角)表示法視為等效**,故全半角括號視為相同字符。

解決方案:選擇 Width-Sensitive (WS) 後綴的排序規則

正確選擇:Chinese_PRC_CI_AS_WS

驗證測試

SELECT 1 
WHERE '03BHL01001(上海)' = '03BHL01001(上海)' 
COLLATE Chinese_PRC_CI_AS_WS

結果:影響行數 0 行 —— 不再相等,問題解決。

如何查看/選擇排序規則

查詢所有排序規則

SELECT * FROM ::fn_helpcollations()

篩選中文排序規則

SELECT * 
FROM ::fn_helpcollations() 
WHERE name LIKE 'Chinese%'

關鍵後綴含義對照

後綴含義示例
_CICase-Insensitive(不區分大小寫)A = a
_CSCase-Sensitive(區分大小寫)A ≠ a
_AIAccent-Insensitive(不區分重音)é = e
_ASAccent-Sensitive(區分重音)é ≠ e
_KIKana-Type-Insensitive(不區分平/片假名)ひらがな = カタカナ
_KSKana-Type-Sensitive(區分平/片假名)ひらがな ≠ カタカナ
_WIWidth-Insensitive(不區分全/半角)( = (
_WSWidth-Sensitive(區分全/半角)( ≠ (

實戰建議

  • 新建資料庫/實例: 業務涉及中文全半角區分時,**務必指定 _WS 後綴排序規則**
  • 既有資料庫修改: 需重建資料庫或使用 COLLATE 子句在列/表達式級指定
  • 列級指定示例:
    CREATE TABLE t (
        code VARCHAR(20) COLLATE Chinese_PRC_CI_AS_WS PRIMARY KEY
    )
    
  • 臨時查詢指定:
    SELECT * FROM t WHERE code = 'xxx' COLLATE Chinese_PRC_CI_AS_WS
    

總結

全半角混淆是中文環境常見坑,**根因在排序規則的 Width-Insensitive 默認值**。選擇 _WS 後綴排序規則(如 Chinese_PRC_CI_AS_WS)可徹底解決,建議在架構設計階段即確定,避免後期重建資料庫的高昂成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved