實際項目中遇到:03BHL01001(上海)(全角括號)與 03BHL01001(上海)(半角括號)被判定為相同,導致主鍵衝突。
( ASCII:0xA3A8( ASCII:0x28SQL Server 排序規則由四部分組成:
默認安裝中文版 SQL Server 選擇 Chinese_PRC_CI_AS,全稱:
Chinese-PRC, Case-Insensitive, Accent-Sensitive, Kana-Type-Insensitive, Width-Insensitive
Width-Insensitive 導致單字節(半角)與雙字節(全角)表示法視為等效**,故全半角括號視為相同字符。
正確選擇: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%'
| 後綴 | 含義 | 示例 |
|---|---|---|
_CI | Case-Insensitive(不區分大小寫) | A = a |
_CS | Case-Sensitive(區分大小寫) | A ≠ a |
_AI | Accent-Insensitive(不區分重音) | é = e |
_AS | Accent-Sensitive(區分重音) | é ≠ e |
_KI | Kana-Type-Insensitive(不區分平/片假名) | ひらがな = カタカナ |
_KS | Kana-Type-Sensitive(區分平/片假名) | ひらがな ≠ カタカナ |
_WI | Width-Insensitive(不區分全/半角) | ( = ( |
_WS | Width-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)可徹底解決,建議在架構設計階段即確定,避免後期重建資料庫的高昂成本。