0

我无法插入主键仅因某些特殊 Unicode 字符而异的记录。

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

主键定义为 an nvarchar,排序规则设置为SQL_Latin1_General_CP1_CI_AS。如果其中有特殊的 Unicode 字符,它可以对主键进行查找,但如果它只是因 Unicode 特殊字符而异(如上例所示),我会在插入时收到重复键错误。你如何解决这个问题?

4

2 回答 2

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 位字符范围,因此补充字符还没有发挥作用。

于 2012-11-01T18:54:08.023 回答
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
于 2012-11-01T18:25:13.450 回答