nvarchar 类型的不区分大小写的主键,其中 ß != ss

Dav*_* S. 5 t-sql sql-server collation case-insensitive sql-server-2012

这个问题“需要一个不区分大小写的排序规则,其中 ss != ß ”为varchar类型列解决了这个问题,但我的必须是nvarchar.

据我所知,SQL_Latin1_General_Cp437_BIN区分ßss。但它也区分大小写。我的是一个主键列,它也需要区分大小写:

我需要例如weiß/Weiß被认为是平等的,还有weiss/ Weiss,但不是weiß/weiss也不是Weiß/Weiss也不是weiß/Weiss等。

我已经为此搜索了很多,真的让我在这里倒霉吗?必须有很多人处于相同的情况,我简直不敢相信这无法解决。

Gar*_*thD 2

我能找到的最接近的解决方法是使用索引视图添加唯一约束,UPPER(ID)以阻止实际主键上使用的二进制排序规则未拾取的主键违规,例如

\n\n
CREATE TABLE CollationTest \n(\n        ID NVARCHAR(50) COLLATE Latin1_General_BIN NOT NULL,\n    CONSTRAINT PK_CollationTest_ID PRIMARY KEY (ID)\n);\nGO\nCREATE VIEW dbo.CollationTestConstraint\nWITH SCHEMABINDING\nAS\n    SELECT  ID = UPPER(ID)\n    FROM    dbo.CollationTest;\nGO\nCREATE UNIQUE CLUSTERED INDEX UQ_CollationTestConstraint_ID \n    ON dbo.CollationTestConstraint (ID);\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在以下内容将作为初始插入:

\n\n
INSERT dbo.CollationTest (ID) VALUES ('wei\xc3\x9f');\nINSERT dbo.CollationTest (ID) VALUES ('Weiss');\n
Run Code Online (Sandbox Code Playgroud)\n\n

但以下操作会失败:

\n\n
INSERT dbo.CollationTest (ID) VALUES ('Wei\xc3\x9f');\nINSERT dbo.CollationTest (ID) VALUES ('weiss');\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

无法在具有唯一索引“UQ_Collat​​ionTestConstraint_ID”的对象“dbo.Collat​​ionTestConstraint”中插入重复的键行。重复的键值为 (WEI\xc3\x9f)。

\n\n

无法在具有唯一索引“UQ_Collat​​ionTestConstraint_ID”的对象“dbo.Collat​​ionTestConstraint”中插入重复的键行。重复的键值为 (WEISS)。

\n
\n\n

经过初步测试后,这似乎符合您的标准。

\n\n

编辑

\n\n

我肯定把这个复杂化了,你可以使用计算列和唯一约束来实现同样的事情:

\n\n
CREATE TABLE CollationTest \n(\n        ID NVARCHAR(50) COLLATE Latin1_General_BIN NOT NULL,\n        IDUpper AS UPPER(ID),\n    CONSTRAINT PK_CollationTest_ID PRIMARY KEY (ID),\n    CONSTRAINT UQ_CollationTest_IDUpper UNIQUE (IDUpper)\n);\n
Run Code Online (Sandbox Code Playgroud)\n