NVARCHAR列上的相等查询在SQL Server 2012中产生多个结果


8

我正在将一个宠物项目从PostgreSQL(9.2.2)移到SQL Server(2012 Standard)。

查询unicode字词时,我注意到了一个有趣的现象。给定定义:

CREATE TABLE [word](
    [id] [int] IDENTITY(0,1) NOT NULL,
    [value] [nvarchar](255) NULL    
 );

和数据:

insert into word (value) values (N'ῥύπῳ');
insert into word  (value) values (N'ἀπὸ');
insert into word  (value) values (N'ἀπό');
insert into word (value) values  (N'ἐπὶ');
insert into word (value) values  (N'ἐπί');
insert into word (value) values  (N'ὑπὸ');
insert into word (value) values  (N'ὑπό');
insert into word (value) values  (N'πίῃ');

insert into word  (value) values (N'λόγους');
insert into word  (value) values (N'λόγχῃ');
insert into word (value) values  (N'λόγων');
insert into word  (value) values (N'ἀλόης');

对特定单词的查询将返回接近匹配项。例如:

select * from word where value = N'ἀπὸ'

返回:

id  value
102137  ῥύπῳ
102141  ἀπὸ
102142  ἀπό
102143  ἐπὶ
102144  ἐπί
102145  ὑπὸ
102146  ὑπό
102147  πίῃ

http://sqlfiddle.com/#!6/1ab66/1

但是,PostgreSQL中的相同模式仅返回完全匹配。如何使SQL Server做到相同?

(PostgreSQL小提琴链接):http ://sqlfiddle.com/#!12/ c57a6/1

我有一种明显的感觉,我想念某些东西,但是我不太能弄清楚它是什么。

数据库排序规则是SQL_Latin1_General_CP1_CI_AS本地安装上的数据库排序规则(也是服务器的排序规则)。

Answers:


8

排序规则确定比较语义。

如果我尝试

CREATE TABLE [word](
    [id] [int] IDENTITY(0,1) NOT NULL,
    [value] [nvarchar](255) COLLATE Latin1_General_100_CI_AS NULL    
 );

它只会返回ἀπὸ

也将后缀更改AI为重音不敏感收益ἀπό

在我安装我已经想尽整理和1526收益1(大概ASBIN排序规则),1264返回2行(大概AI)和1095回报8

通过快速浏览,最后一个组看起来包括所有SQL归类和90归类,而所有归类和归类100都位于前两个组中,因此我认为这是在2008年归类中已解决的问题。(请参阅SQL Server 2008排序规则中的新增功能

自己尝试的脚本

DECLARE @Results TABLE
(
Count INT,
Collation SYSNAME
)

SET NOCOUNT ON;
DECLARE @N SYSNAME;
DECLARE @C1 AS CURSOR;
SET @C1 = CURSOR FAST_FORWARD FOR 
SELECT name
FROM sys.fn_helpcollations();
OPEN @C1;
FETCH NEXT FROM @C1 INTO @N ;
WHILE @@FETCH_STATUS = 0
BEGIN
  INSERT @Results
  EXEC('SELECT COUNT(*), ''' + @N + ''' from word where value = N''ἀπὸ'' COLLATE ' + @N)
  FETCH NEXT FROM @C1 INTO @N ;
END

SELECT *
FROM @Results
ORDER BY Count DESC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.