Entity framework 如何在SQL Server中使用Unicode字符串作为主键

Entity framework 如何在SQL Server中使用Unicode字符串作为主键,entity-framework,unicode,indexing,sql-server-2012,Entity Framework,Unicode,Indexing,Sql Server 2012,插入主键仅随某些特殊Unicode字符变化的记录时遇到问题 例如,如果数据库中已有一条主键为“test”的记录,并且我尝试插入另一条主键为“test+'\u13A4'+'\u13B4'+'\u13B9'的记录,则会出现重复的键错误。我在SQL Server 2012中使用EF 5 主键定义为nvarchar,排序规则设置为SQL\u Latin1\u General\u CP1\u CI\u as。如果主键中有特殊的Unicode字符,它可以很好地查找主键,但是如果它只是因Unicode特殊字符

插入主键仅随某些特殊Unicode字符变化的记录时遇到问题

例如,如果数据库中已有一条主键为
“test”
的记录,并且我尝试插入另一条主键为
“test+'\u13A4'+'\u13B4'+'\u13B9'
的记录,则会出现重复的键错误。我在SQL Server 2012中使用EF 5


主键定义为
nvarchar
,排序规则设置为
SQL\u Latin1\u General\u CP1\u CI\u as
。如果主键中有特殊的Unicode字符,它可以很好地查找主键,但是如果它只是因Unicode特殊字符而变化(如上面的示例所示),则在插入时会出现重复键错误。如何解决此问题?

这必须与连接字符串的方式有关。以下是我的作品:

    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

SQL\u Latin1\u 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位字符范围内,因此补充字符尚未生效。

请尝试使用排序规则Latin1\u General\u 100\u CI\u AS\u SC,如下所述:谢谢您的回复。我问题中的字符串是C#代码,这就是如何转义特殊的unicode字符。您的测试只是插入一个带有转义序列的字符串,而不是实际的unicode字符。对于TSQL,您需要使用nchar和十进制值。如果您使用N'test'+nchar(5028)+nchar(5044)+nchar(5049),它将失败。