这个问题“Need a case insensitive collation where ss != ß”解决了varchar
type列的问题,但是我的必须是nvarchar
。
据我所知,SQL_Latin1_General_Cp437_BIN
可以区分ß
和ss
。但这也是区分大小写的。我的是一个主键列,也需要不区分大小写:
我需要weiß
/Weiß
被认为是相等的,而且weiss
/Weiss
也被认为是相等的,但不是weiß
/weiss
也不是Weiß
/Weiss
也不是weiß
/Weiss
等。
我为此进行了很多搜索,是否真的让我在这里不走运?在相同的情况下必须有很多人,我简直不敢相信这可能无法解决。
最佳答案
我能找到的最接近的解决方法是使用索引 View 在UPPER(ID)
上添加唯一约束以停止主键违例,而实际主键上使用的二进制排序规则并未解决该主键违例问题,例如
CREATE TABLE CollationTest
(
ID NVARCHAR(50) COLLATE Latin1_General_BIN NOT NULL,
CONSTRAINT PK_CollationTest_ID PRIMARY KEY (ID)
);
GO
CREATE VIEW dbo.CollationTestConstraint
WITH SCHEMABINDING
AS
SELECT ID = UPPER(ID)
FROM dbo.CollationTest;
GO
CREATE UNIQUE CLUSTERED INDEX UQ_CollationTestConstraint_ID
ON dbo.CollationTestConstraint (ID);
现在,以下内容将作为初始插入内容:
INSERT dbo.CollationTest (ID) VALUES ('weiß');
INSERT dbo.CollationTest (ID) VALUES ('Weiss');
但是以下操作将失败:
INSERT dbo.CollationTest (ID) VALUES ('Weiß');
INSERT dbo.CollationTest (ID) VALUES ('weiss');
初始测试后,这似乎符合您的条件。
编辑
我绝对对此感到复杂,您可以通过计算列和唯一约束来实现相同的目的:
CREATE TABLE CollationTest
(
ID NVARCHAR(50) COLLATE Latin1_General_BIN NOT NULL,
IDUpper AS UPPER(ID),
CONSTRAINT PK_CollationTest_ID PRIMARY KEY (ID),
CONSTRAINT UQ_CollationTest_IDUpper UNIQUE (IDUpper)
);