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

大小寫敏感資料庫中 DISTINCT 去重行為差異解析

     編輯:關於SqlServer

問題現象

SQL Server 允許儲存混合大小寫資料,但資料庫定序決定比較時是否區分大小寫。若資料庫為不區分大小寫(如 SQL_Latin1_General_CP1_CI_AS),DISTINCT 會將 "Adam" 與 "ADAM" 視為相同值,導致去重結果不符預期。

實測對比:AdventureWorks (區分大小寫) vs. 測試資料庫 (不區分大小寫)

案例 1:區分大小寫資料庫

SELECT DISTINCT TOP 10 FirstName
FROM Person.Contact
WHERE FirstName LIKE 'A%'
ORDER BY 1;

結果正常顯示 "Adam"、"Adrian" 等不同值。若將 ContactID=62 的 FirstName 從 "Adam" 改為 "ADAM",再次查詢會同時出現 "Adam" 與 "ADAM" 兩筆。

案例 2:不區分大小寫資料庫

CREATE TABLE Test.dbo.contact (FirstName nvarchar(50));
INSERT INTO Test.dbo.contact SELECT FirstName FROM Person.Contact;
SELECT DISTINCT TOP 10 FirstName FROM Test.dbo.contact WHERE FirstName LIKE 'A%' ORDER BY 1;

結果將 "Adam" 與 "ADAM" 合併為單一列,因定序導致比較時忽略大小寫。

解決方案

  1. 指定定序進行查詢: SELECT DISTINCT FirstName COLLATE Latin1_General_CS_AS FROM ...
  2. 使用二進位定序: COLLATE Latin1_General_BIN 逐位元組比較,最嚴格區分大小寫與重音。
  3. 資料庫層級規劃: 新建資料庫時明確指定 COLLATE ..._CS_AS 定序,從根源避免混淆。

最佳實務

在多語系或嚴格區分代碼(如 SKU、帳號)的系統中,建議採用區分大小寫定序,並在查詢層面明確指定 COLLATE 以確保行為一致。

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