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

SQL Server全形/半形字元比較問題:排序規則width敏感度解決主鍵衝突

     編輯:關於SqlServer

現象

專案中03BHL01001(上海)(全形括號)與03BHL01001(上海)(半形括號)被視為相同,導致**主鍵重複錯誤**。ASCII碼明顯不同:全形(= 0xA3A8,半形( = 0x28。

根因:排序規則的Width Insensitive預設值

中文版SQL Server預設排序規則:Chinese_PRC_CI_AS(Chinese-PRC, Case-Insensitive, Accent-Sensitive, Kana-Insensitive, Width-Insensitive)。Width-Insensitive = 不區分全形/半形**,視為等價。

解決:指定Width Sensitive (WS)排序規則

-- 查詢層級指定
SELECT 1 WHERE '03BHL01001(上海)' = '03BHL01001(上海)' COLLATE Chinese_PRC_CI_AS_WS
-- 影響行數:0(正確區分)

-- 或建表/欄位層級指定
CREATE TABLE T (C NVARCHAR(50) COLLATE Chinese_PRC_CI_AS_WS PRIMARY KEY)

如何查看所有中文排序規則

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

挑選尾碼含_WS者(如Chinese_PRC_CI_AS_WS、Chinese_Taiwan_Stroke_CI_AS_WS)。

影響範圍

  • 比較運算(=, <>, >, <等)
  • 排序(ORDER BY)
  • 分組(GROUP BY)
  • 唯一約束/主鍵/索引鍵值比較

建議:業務涉及全半形混雜(如代碼、編號、身分證字號)的欄位,**務必在建表時指定_WS排序規則**,避免臨時COLLATE影響索引使用與效能。

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