SQL Server 2012でNVARCHAR列の同等クエリが複数の結果を生成する


8

ペットプロジェクトをPostgreSQL(9.2.2)からSQL Server(2012 Standard)に移行中です。

Unicodeの単語をクエリするときに、興味深い現象に気づきました。定義を考えると:

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、ローカルインストール上にあります(これもサーバーの照合順序です)。

回答:


8

照合順序は、比較セマンティクスを決定します。

私がしようとすると

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

戻るだけἀπὸです。

AIアクセントを区別しないために接尾辞をに変更してἀπόも戻ります。

私のインストールでは、すべての照合と1526戻り1(おそらくASand BIN照合)を試し、12642行(おそらくAI)を1095返し、を返しました8

簡単に見ると、この最後のグループはすべてのSQL照合順序と90照合順序を含むように見えますが、すべての照合順序100は最初の2つのグループにあるため、これは2008年の照合順序のバッチで修正された問題だと思います。(SQL Server 2008照合順序の新機能を参照)

これを自分で試すスクリプト

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.