SQL Server 大小寫敏感度由定序 (Collation) 決定,可在資料庫、資料行、運算式三個層面設定。本文彙整三種常用做法,滿足不同場景需求。
-- 資料行層級
ALTER TABLE tb ALTER COLUMN colname NVARCHAR(100) COLLATE Chinese_PRC_CI_AS; -- 不區分大小寫
ALTER TABLE tb ALTER COLUMN colname NVARCHAR(100) COLLATE Chinese_PRC_CS_AS; -- 區分大小寫
-- 資料庫層級
ALTER DATABASE 資料庫名稱 COLLATE Chinese_PRC_CS_AS;
CI = Case Insensitive,CS = Case Sensitive。資料庫層級變更影響新建資料行預設定序,現有資料行需逐一 ALTER COLUMN。
CREATE FUNCTION StrComp(@Str1 VARCHAR(50), @Str2 VARCHAR(50))
RETURNS INT
AS BEGIN
DECLARE @i INT = 0, @y INT = 1, @iLen INT;
SET @iLen = CASE WHEN LEN(LTRIM(RTRIM(@Str1))) < LEN(LTRIM(RTRIM(@Str2)))
THEN LEN(LTRIM(RTRIM(@Str2))) ELSE LEN(LTRIM(RTRIM(@Str1))) END;
WHILE @i < @iLen
BEGIN
IF ASCII(SUBSTRING(@Str1, @i+1, 1)) = ASCII(SUBSTRING(@Str2, @i+1, 1))
SET @i = @i + 1;
ELSE BEGIN SET @y = 0; BREAK; END
END
RETURN @y;
END
用法:WHERE dbo.StrComp(Field1, 'aAbB') = 1。逐字元比較 ASCII 碼,效能較差,適合小資料量或特定業務邏輯。
SELECT * FROM tb WHERE colname = 'abc' COLLATE Chinese_PRC_CS_AS; -- 區分大小寫比較
SELECT * FROM tb WHERE colname = 'abc' COLLATE Chinese_PRC_CI_AS; -- 不區分大小寫比較
不改變結構描述,靈活控制單一比較操作的敏感度。
COLLATE