处理unicode时SQL Server 2014的行为不一致

时间:2016-03-08 17:41:02

标签: sql-server unicode

我的目标是在可能包含任何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;⭐"特殊的是它在连接到字符串时违反了唯一性约束吗?

谢谢

詹姆斯

0 个答案:

没有答案