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
等。
我已经为此搜索了很多,真的让我在这里倒霉吗?必须有很多人处于相同的情况,我简直不敢相信这无法解决。
我能找到的最接近的解决方法是使用索引视图添加唯一约束,UPPER(ID)
以阻止实际主键上使用的二进制排序规则未拾取的主键违规,例如
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\nINSERT dbo.CollationTest (ID) VALUES ('wei\xc3\x9f');\nINSERT dbo.CollationTest (ID) VALUES ('Weiss');\n
Run Code Online (Sandbox Code Playgroud)\n\n但以下操作会失败:
\n\nINSERT dbo.CollationTest (ID) VALUES ('Wei\xc3\x9f');\nINSERT dbo.CollationTest (ID) VALUES ('weiss');\n
Run Code Online (Sandbox Code Playgroud)\n\n\n\n\n无法在具有唯一索引“UQ_CollationTestConstraint_ID”的对象“dbo.CollationTestConstraint”中插入重复的键行。重复的键值为 (WEI\xc3\x9f)。
\n\n无法在具有唯一索引“UQ_CollationTestConstraint_ID”的对象“dbo.CollationTestConstraint”中插入重复的键行。重复的键值为 (WEISS)。
\n
经过初步测试后,这似乎符合您的标准。
\n\n编辑
\n\n我肯定把这个复杂化了,你可以使用计算列和唯一约束来实现同样的事情:
\n\nCREATE 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
归档时间: |
|
查看次数: |
1039 次 |
最近记录: |