【问题标题】:SQL Server 2008: Collation ignored in unique index?SQL Server 2008:唯一索引中忽略了排序规则?
【发布时间】:2010-08-18 04:57:44
【问题描述】:

我在我的表上创建了一个复合唯一索引:

CREATE TABLE [dbo].[SearchIndexWord](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [CatalogID] [int] NOT NULL,
    [Word] [nvarchar](100) NOT NULL,
CONSTRAINT [PK_SearchIndexWord] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
) 
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) 
ON [PRIMARY]

CREATE UNIQUE NONCLUSTERED INDEX [IX_SearchIndexWord] ON [dbo].[SearchIndexWord] 
(
    [Word] ASC,
    [CatalogID] ASC
)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) 
ON [PRIMARY]

整个数据库的排序规则设置为 SQL_Latin1_General_CP1_CI_AS。当我运行以下 T-SQL 时,它会打印“不等于”:

IF 'm3/h' = 'm³/h'
    PRINT 'Equals'
ELSE
    PRINT 'Does not equal'

然后,如果我尝试以下插入语句:

INSERT INTO [SearchIndexWord] (Word, CatalogID) VALUES ('m3/h', 1), ('m³/h', 1)

我收到以下错误消息:

Msg 2601, Level 14, State 1, Line 1
Cannot insert duplicate key row in object 'dbo.SearchIndexWord' with unique index 'IX_SearchIndexWord'.

这是为什么?我在文档中找不到它,但我假设使用配置的排序规则检查两个键重复的条件。

我顺便检查了表、列和索引排序规则,它们都等于数据库排序规则。

【问题讨论】:

    标签: sql-server sql-server-2008 collation unique-index


    【解决方案1】:

    试试这个:

    IF CAST('m3/h' AS NVARCHAR(100)) = CAST('m³/h' AS NVARCHAR(100))
        PRINT 'Equals' 
    ELSE 
        PRINT 'Does not equal' 
    

    对我来说,这会返回 'Equals',这解释了为什么您会收到重复键行错误。

    我怀疑代码 IF 'm3/h' = 'm³/h' 中的值被创建为 VARCHAR。

    【讨论】:

    • 你是对的。我通过为有问题的列提供不同的排序规则 (SQL_Latin1_General_BIN) 解决了这个问题。此外,它的工作方式如下:IF N'm3/h' = N'm³/h'
    • CAST() 方法有效,因为它将两个字符串都转换为 unicode。一个更快/更简单的方法是这样的: IF N'm3/h' = N'm³/h' PRINT 'Equals' ELSE PRINT 'Does not equal' 通过将 N 标记放在每个字符串的前面,你'重新告诉 SQL Server 将每个字符串视为 unicode - 然后我得到“等于”。同样,您也可以使用此处概述的 COLLATE 子句:sqlmag.com/blog/practical-sql-server-45/tsql/…
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2019-09-21
    相关资源
    最近更新 更多