这个问题“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)
);

10-04 15:00