我正在将一个宠物项目从 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
(也是服务器的排序规则)在本地安装。
排序规则决定了比较语义。
如果我尝试
它只会返回
ἀπὸ
。将后缀更改
AI
为不区分重音ἀπό
也会返回。在我的安装中,我尝试了所有排序规则和
1526
返回1
(大概是AS
和BIN
排序规则),1264
返回 2 行(大概是AI
)并1095
返回8
。快速浏览最后一组看起来包括所有
SQL
归类和90
归类,而所有归类都100
在前 2 组中,所以我认为这是 2008 年归类批次中已修复的一些问题。(请参阅SQL Server 2008 排序规则中的新增功能)自己尝试的脚本