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

时间:2012-11-01 17:49:27

标签: entity-framework unicode indexing sql-server-2012

我在插入主键的记录时遇到问题,主键只是因某些特殊的Unicode字符而异。

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

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

2 个答案:

答案 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