SQL Server 允許儲存混合大小寫資料,但資料庫定序決定比較時是否區分大小寫。若資料庫為不區分大小寫(如 SQL_Latin1_General_CP1_CI_AS),DISTINCT 會將 "Adam" 與 "ADAM" 視為相同值,導致去重結果不符預期。
SELECT DISTINCT TOP 10 FirstName
FROM Person.Contact
WHERE FirstName LIKE 'A%'
ORDER BY 1;
結果正常顯示 "Adam"、"Adrian" 等不同值。若將 ContactID=62 的 FirstName 從 "Adam" 改為 "ADAM",再次查詢會同時出現 "Adam" 與 "ADAM" 兩筆。
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" 合併為單一列,因定序導致比較時忽略大小寫。
SELECT DISTINCT FirstName COLLATE Latin1_General_CS_AS FROM ...COLLATE Latin1_General_BIN 逐位元組比較,最嚴格區分大小寫與重音。COLLATE ..._CS_AS 定序,從根源避免混淆。在多語系或嚴格區分代碼(如 SKU、帳號)的系統中,建議採用區分大小寫定序,並在查詢層面明確指定 COLLATE 以確保行為一致。