La requête d'égalité sur la colonne NVARCHAR donne plusieurs résultats dans SQL Server 2012

8

Je suis en train de déplacer un projet pour animaux de compagnie de PostgreSQL (9.2.2) vers SQL Server (2012 Standard).

J'ai remarqué un phénomène intéressant lors de l'interrogation de mots unicode. Compte tenu de la définition:

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

et les données:

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'ἀλόης');

une requête pour un mot particulier renverra des correspondances proches. Par exemple:

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

Retour:

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

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

Cependant, le même modèle dans PostgreSQL ne renvoie que la correspondance exacte. Comment puis-je demander à SQL Server de faire de même?

(Lien violon PostgreSQL): http://sqlfiddle.com/#!12/c57a6/1

J'ai le sentiment distinct que je manque quelque chose, mais je ne suis pas tout à fait capable de comprendre ce que c'est.

Le classement de la base de données est SQL_Latin1_General_CP1_CI_AS(qui est également le classement du serveur) sur une installation locale.

swasheck
la source

Réponses:

8

Le classement détermine la sémantique de comparaison.

Si j'essaye

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

Il revient seulement ἀπὸ.

Changer également le suffixe AIpour les retours insensibles aux accents ἀπό.

Sur mon installation, j'ai essayé chaque classement et 1526retour 1(probablement ASet les BINclassements), 1264retourne 2 lignes (probablement AI) et 1095retour 8.

D'un coup d'œil rapide, ce dernier groupe semble inclure tous les SQLclassements et 90classements alors que tous 100ceux-ci sont dans les 2 premiers groupes, donc je suppose que c'est un problème qui a été résolu dans le lot de classements 2008. (Voir Nouveautés des classements SQL Server 2008 )

Script pour essayer vous-même

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
Martin Smith
la source