有关SQL Server中重音不敏感的问题(Latin1_General_CI_AS)

时间:2013-01-25 16:24:27

标签: sql-server collation accent-insensitive

我们使用默认排序规则(Latin1_General_CI_AS)安装了所有数据库。

我们计划更改排序规则,以允许客户端使用重音不敏感度搜索数据库。

问题:

  1. 具有重音不敏感数据库的负面影响(如果有的话)是什么?

  2. 重音不敏感数据库是否有任何性能开销?

  3. 为什么SQL Server排序规则的默认值非常敏感;为什么有人会默认需要重音?

1 个答案:

答案 0 :(得分:5)

说真的,改变数据库排序是一种巨大的痛苦。从codeproject看这个HOWTO,然后在你做之前先仔细思考吧!这是方便的方式!

首先,您可以通过指定作为搜索的一部分,不必更改排序规则来允许搜索具有重音不敏感性的数据库。

 select * from TableName
 where name collate Latin1_General_CI_AI like @parameter

简单如。但是,这会伤害索引。

另一种方法是提供一个可以单独索引的计算字段。

    create table TableName(
    ix int identity primary key,
    name nvarchar(20) collate latin1_general_ci_as
    )
    go
    alter table TableName
    add  name_AI as name collate latin1_general_CI_AI
    go
    create index IX_TableName_name_AI
    on dbo.TableName(name_AI)

上面的示例将其放在表中,但您也可以创建索引视图。

    create view dbo.TableName_AI
    with schemabinding
    as 
    select ix,
    name collate Latin1_general_CI_AI as name
    from dbo.TableName
    go
    -- Need a unique clustered index first
    create unique clustered index IX_TableName_AI_Clustered on dbo.TableName_AI(ix)
    -- then the index for searching
    create index IX_TableName_AI_name on dbo.TableName_AI(name)

然后,对于不区分重音的搜索,请使用视图TableName_AI

回答您的具体问题:

  1. 在重音不敏感的数据库中,重音敏感搜索会更慢。

  2. 是的,但不是这样你会注意到

  3. 就是这样。某些东西必须是默认值:如果你不喜欢它,请不要使用默认值!

    这样想:“硬”和“群”不是同一个词。那一个元音差异就足够了 - 即使它们听起来很相似。

    重音差异(a与á)介于案例差异(A与a)和字母差异(a​​与e之间)之间。你必须在某处画线。

    重音影响了单词的声音,并且可以使它具有不同的含义,尽管我很难想到例子。我想对于那些在使用重音的语言中在他们的数据库中有单词的人来说更有意义。