Truy vấn bình đẳng trên cột NVARCHAR mang lại nhiều kết quả trong SQL Server 2012


8

Tôi đang trong quá trình chuyển một dự án thú cưng từ PostgreSQL (9.2.2) sang SQL Server (Tiêu chuẩn 2012).

Tôi đã nhận thấy một hiện tượng thú vị khi truy vấn các từ unicode. Đưa ra định nghĩa:

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

và dữ liệu:

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

một truy vấn cho một từ cụ thể sẽ trả về gần khớp. Ví dụ:

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

trả về:

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

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

Tuy nhiên, mẫu tương tự trong PostgreSQL chỉ trả về kết quả khớp chính xác. Làm cách nào để SQL Server thực hiện tương tự?

(Liên kết fiddle PostgreSQL): http://sqlfiddle.com/#!12/c57a6/1

Tôi có cảm giác khác biệt rằng tôi đang thiếu một cái gì đó, nhưng tôi không hoàn toàn có thể tìm ra nó là gì.

Đối chiếu cơ sở dữ liệu là SQL_Latin1_General_CP1_CI_AS(cũng là đối chiếu của máy chủ) trên bản cài đặt cục bộ.

Câu trả lời:


8

Đối chiếu xác định ngữ nghĩa so sánh.

Nếu tôi cố gắng

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

Nó chỉ trở về ἀπὸ.

Thay đổi hậu tố thành AIcho dấu trả lại không nhạy cảm ἀπόcũng.

Trong quá trình cài đặt của mình, tôi đã thử mọi đối chiếu và 1526trả về 1(có lẽ là ASBINđối chiếu), 1264trả về 2 hàng (có lẽ là AI) và 1095trả về 8.

Từ cái nhìn nhanh qua nhóm cuối cùng này có vẻ bao gồm tất cả các SQLđối chiếu và 90đối chiếu trong khi tất cả các nhóm 100nằm trong 2 nhóm đầu tiên, vì vậy tôi cho rằng đây là một số vấn đề đã được khắc phục trong đợt đối chiếu năm 2008. (Xem Có gì mới trong Bộ sưu tập SQL Server 2008 )

Kịch bản để tự thử

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.