我在插入主键的记录时遇到问题,主键只是因某些特殊的Unicode字符而异。
例如,如果我的数据库中已有一条主键为"test"
的记录,并且我尝试插入另一条主键为"test + '\u13A4' + '\u13B4' + '\u13B9'"
的记录,则会出现重复键错误。我在SQL Server 2012中使用EF 5。
主键定义为nvarchar
,排序规则设置为SQL_Latin1_General_CP1_CI_AS
。如果在那里有特殊的Unicode字符,它可以查看主键,但如果它只是因为Unicode特殊字符而异(如上例所示),我会在插入时得到重复的键错误。你是如何解决这个问题的?
答案 0 :(得分:1)
SQL_Latin1_CP1排序规则不适用于所有Unicode代码点。
select N'test' collate SQL_Latin1_General_CP1_CI_AS
union
select N'test' + nchar(5028) + nchar(5044) + nchar(5049)
-- result: 1 row
从SQL Server 2008开始使用较新版本,例如
select N'test' collate Latin1_General_100_CI_AS
union
select N'test' + nchar(5028) + nchar(5044) + nchar(5049)
-- result: 2 rows
您使用的unicode字符属于16位字符范围,因此补充字符尚未发挥作用。
答案 1 :(得分:0)
这必须与你如何连接字符串有关。以下适用于我:
CREATE TABLE #UnicodeTest (
UnicodePK NVARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS PRIMARY KEY
)
INSERT #UnicodeTest
( UnicodePK )
VALUES ( N'test'
)
INSERT #UnicodeTest
( UnicodePK )
VALUES ( N'test\u13A4\u13B4\u13B9'
)
INSERT #UnicodeTest
( UnicodePK )
VALUES ( N'test + \u13A4 + \u13B4 + \u13B9'
)
INSERT #UnicodeTest
( UnicodePK )
VALUES ( N'test + ''\u13A4'' + ''\u13B4'' + ''\u13B9'''
)
SELECT * FROM #UnicodeTest
DROP TABLE #UnicodeTest