我的目标是在可能包含任何unicode平面上的unicode字符的列上强制使用不区分大小写的唯一性。但是在针对SQL Server 2014(build 12.0.4213.0)进行测试时遇到了一些不一致的行为。这是测试:
CREATE TABLE unicodetest1 (
id int,
/* this collation is supposed to support all supplementary unicode characters */
a nvarchar(10) COLLATE Latin1_General_100_CI_AS_SC
);
CREATE UNIQUE INDEX idx_a_1 ON unicodetest1(a);
我可以在BMP和SMP(平面1)上插入许多单个unicode字符:
INSERT INTO unicodetest1(id, a) VALUES(1, 't'); -- U+0074
INSERT INTO unicodetest1(id, a) VALUES (100, N''); -- U+1F478
INSERT INTO unicodetest1(id, a) VALUES (101, N''); -- U+1F479
INSERT INTO unicodetest1(id, a) VALUES (104, N'⭐'); -- U+2b50
SELECT id, a, len(a) FROM unicodetest1;
单个字符串的长度为1,这是预期的。
当我将一些unicode字符连接到ascii字符串时,它仍然可以工作:
INSERT INTO unicodetest1(id, a) VALUES (111, N'test'); -- ok
INSERT INTO unicodetest1(id, a) VALUES (112, N'test'); -- ok
INSERT INTO unicodetest1(id, a) VALUES (113, N'test'); -- ok
到目前为止一切顺利。
但是,当我插入N'test⭐'时,我会收到重复的密钥违规行为:
INSERT INTO unicodetest1(id, a) VALUES (114, N'test⭐'); -- dup
Msg 2601, Level 14, State 1, Line 21
Cannot insert duplicate key row in object 'dbo.unicodetest1' with unique index 'idx_a_1'. The duplicate key value is (test⭐).
角色"⭐"有一个代码点U + 2b50,它在BMP上!
似乎SQL Server认为N'test⭐'和N'测试'是完全相同的!
我的问题是:是什么让#34;⭐"特殊的是它在连接到字符串时违反了唯一性约束吗?
谢谢
詹姆斯