Kueri kesetaraan pada kolom NVARCHAR menghasilkan beberapa hasil di SQL Server 2012

8

Saya sedang dalam proses memindahkan proyek kesayangan dari PostgreSQL (9.2.2) ke SQL Server (2012 Standard).

Saya telah memperhatikan fenomena menarik ketika menanyakan kata-kata unik. Diberi definisi:

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

dan datanya:

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

kueri untuk kata tertentu akan kembali mendekati kecocokan. Sebagai contoh:

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

pengembalian:

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

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

Namun, pola yang sama di PostgreSQL hanya mengembalikan kecocokan persis. Bagaimana saya bisa mendapatkan SQL Server untuk melakukan hal yang sama?

(Tautan biola PostgreSQL): http://sqlfiddle.com/#!12/c57a6/1

Saya memiliki perasaan yang berbeda bahwa saya kehilangan sesuatu, tetapi saya tidak dapat menemukan apa itu.

Database collation adalah SQL_Latin1_General_CP1_CI_AS(yang juga merupakan collation server) pada instalasi lokal.

swasheck
sumber

Jawaban:

8

Kolasi menentukan semantik perbandingan.

Jika saya mencoba

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

Itu hanya kembali ἀπὸ.

Mengubah akhiran untuk AIuntuk pengembalian tidak sensitif aksen ἀπόjuga.

Pada instalasi saya, saya telah mencoba setiap susunan dan 1526kembali 1(mungkin ASdan BINsusunan), 1264mengembalikan 2 baris (mungkin AI) dan 1095kembali 8.

Dari sekilas melihat kelompok terakhir ini terlihat mencakup semua SQLpemeriksaan dan 90pengumpulan sedangkan semua 100yang ada di 2 kelompok pertama jadi saya kira ini adalah beberapa masalah yang telah diperbaiki dalam kumpulan 2008 kumpulan. (Lihat Apa yang Baru di SQL Server 2008 Collations )

Script untuk mencoba ini sendiri

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
sumber