この文書の最新版は
http://naka.wankuma.com/site/column/server/00011.htm
この文書はWindows XP Professional + SQL Server 2005 CTP Sep/2005 での情報です。
SQL Server 2005でbin2照合順序というのが追加されました。
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.ja/instsql9/html/0511195f-16dc-4334-adde-ff5e5e7f6c9f.htm
#ネット上の情報が公開され次第リンクは変更します。
まずは実験として以下のSQLを実行してみてください。
set nocount on
--テストテーブル作成
declare @tab table(
UnicodeNo int primary key,
UnicodeChar nchar(1),
binorder int,
bin2order int
)
--テストデータ作成
declare @loop int
set @loop = 0
while ( @loop < 65536 )
begin
insert into @tab(unicodeno, unicodechar) values(@loop, nchar(@loop))
set @loop = @loop + 1
end
--JapaneseBinCollateでカーソルを開く
declare @UnicodeNo int
Declare CursorJapaneseBin Cursor for select UnicodeNo from @tab order by UnicodeChar collate japanese_90_bin
OPEN CursorJapaneseBin
set @loop = 0
FETCH NEXT FROM CursorJapaneseBin into @UnicodeNo
WHILE @@FETCH_STATUS = 0
BEGIN
-- This is executed as long as the previous fetch succeeds.
update @tab set binorder = @loop from @tab where UnicodeNo = @UnicodeNo
FETCH NEXT FROM CursorJapaneseBin into @UnicodeNo
set @loop = @loop + 1
END
CLOSE CursorJapaneseBin
DEALLOCATE CursorJapaneseBin
------------------------------------
Declare CursorJapaneseBin2 Cursor for select UnicodeNo from @tab order by UnicodeChar collate japanese_90_bin2
OPEN CursorJapaneseBin2
set @loop = 0
FETCH NEXT FROM CursorJapaneseBin2 into @UnicodeNo
WHILE @@FETCH_STATUS = 0
BEGIN
-- This is executed as long as the previous fetch succeeds.
update @tab set bin2order = @loop from @tab where UnicodeNo = @UnicodeNo
FETCH NEXT FROM CursorJapaneseBin2 into @UnicodeNo
set @loop = @loop + 1
END
select * from @tab where binorder <> bin2order
以上のSQLを実行するとJapanese_90_binとJapanese_90_bin2という新しいbin2照合順序を利用したソート順序の違いを洗い出してくれます。
| UnicodeNo |
UnicodeChar |
binorder |
bin2order |
| 0 |
� |
1 |
0 |
| 1 |
|
2 |
1 |
| 2 |
|
3 |
2 |
| 3 |
|
4 |
3 |
| 4 |
|
5 |
4 |
| 5 |
|
6 |
5 |
| 6 |
|
7 |
6 |
| 7 |
|
8 |
7 |
| 8 |
|
9 |
8 |
| 9 |
|
0 |
9 |
| 10 |
|
11 |
10 |
| 11 |
|
12 |
11 |
| 12 |
|
13 |
12 |
| 13 |
|
14 |
13 |
| 14 |
|
15 |
14 |
| 15 |
|
16 |
15 |
| 16 |
|
17 |
16 |
| 17 |
|
18 |
17 |
| 18 |
|
19 |
18 |
| 19 |
|
10 |
19 |
| 20 |
|
21 |
20 |
| 21 |
|
22 |
21 |
| 22 |
|
23 |
22 |
| 23 |
|
24 |
23 |
| 24 |
|
25 |
24 |
| 25 |
|
26 |
25 |
| 26 |
|
27 |
26 |
| 27 |
|
28 |
27 |
| 28 |
|
29 |
28 |
| 29 |
|
20 |
29 |
| 30 |
|
31 |
30 |
| 31 |
|
32 |
31 |
| 32 |
|
0 |
32 |
このように従来のBin照合順序にはSpaceを1番最初に持ってくるという問題があったことがわかります。
SQL Server 2005でバイナリ照合順序を検討する場合にはbin2を利用すべきだと思われます。
like検索での問題もありJapanese_90_Bin2照合順序が(残念ながら)大本命と成ると思います。