Запрос на равенство в столбце NVARCHAR дает несколько результатов в SQL Server 2012

8

Я нахожусь в процессе перемещения любимого проекта из PostgreSQL (9.2.2) в SQL Server (стандарт 2012).

Я заметил интересный феномен, когда запрашивал слова в юникоде. Учитывая определение:

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(которые также являются параметрами сортировки сервера) при локальной установке.

swasheck
источник

Ответы:

8

Сопоставление определяет семантику сравнения.

Если я попробую

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

Это только возвращает ἀπὸ.

Изменение суффикса на AIдля нечувствительных к акценту возвратов ἀπόтакже.

В моей установке я пробовал все параметры сортировки и 1526возврата 1(предположительно ASи BINсопоставления), 1264возвращает 2 строки (предположительно AI) и 1095возвращает 8.

При быстром просмотре этой последней группы мы видим, что в нее включены все параметры SQLсортировки и 90сопоставления, тогда как все 100они входят в первые 2 группы, поэтому я предполагаю, что это некоторая проблема, которая была исправлена ​​в серии сопоставлений 2008 года. (См. Что нового в SQL Server 2008 Collation )

Скрипт, чтобы попробовать это самостоятельно

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
Мартин Смит
источник