Die Gleichheitsabfrage für die NVARCHAR-Spalte führt in SQL Server 2012 zu mehreren Ergebnissen

8

Ich bin gerade dabei, ein Haustierprojekt von PostgreSQL (9.2.2) auf SQL Server (2012 Standard) zu verschieben.

Ich habe ein interessantes Phänomen beim Abfragen von Unicode-Wörtern festgestellt. Angesichts der Definition:

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

und die Daten:

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

Eine Abfrage für ein bestimmtes Wort gibt nahezu Übereinstimmungen zurück. Zum Beispiel:

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

kehrt zurück:

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

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

Das gleiche Muster in PostgreSQL gibt jedoch nur die genaue Übereinstimmung zurück. Wie kann ich SQL Server dazu bringen, dasselbe zu tun?

(PostgreSQL-Geigenlink): http://sqlfiddle.com/#!12/c57a6/1

Ich habe das deutliche Gefühl, dass mir etwas fehlt, aber ich kann nicht ganz herausfinden, was es ist.

Die Datenbanksortierung befindet sich SQL_Latin1_General_CP1_CI_AS(dies ist auch die Sortierung des Servers) in einer lokalen Installation.

Swasheck
quelle

Antworten:

8

Die Kollatierung bestimmt die Vergleichssemantik.

Wenn ich es versuche

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

Es wird nur zurückgegeben ἀπὸ.

Ändern Sie das Suffix auch AIfür akzentunempfindliche Rückgaben ἀπό.

Bei meiner Installation habe ich jede Kollatierung und 1526Rückgabe 1(vermutlich ASund BINKollatierungen) ausprobiert , 12642 Zeilen (vermutlich AI) zurückgegeben und 1095zurückgegeben 8.

Bei einem kurzen Blick durch diese letzte Gruppe werden alle SQLKollatierungen und 90Kollatierungen eingeschlossen, während sich alle 100in den ersten beiden Gruppen befinden. Ich gehe also davon aus, dass dies ein Problem ist, das im Kollatierungsstapel 2008 behoben wurde. (Siehe Neue Funktionen in SQL Server 2008-Sortierungen. )

Skript, um dies selbst zu versuchen

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
quelle