質問: 現在、.NET COBOL/ORACLEからC#/SQLServerへの移植作業をしています。 SQLServerから取得する際にOrderByで下記のNAMEを昇順で取得したところ 下記のような順序で取得されました。 C#では濁点付きが先に並んでしまうのですが .NET COBOLと同じような並びにするにはどうすればいいのでしょうか? ORACLE:JA16SJISTILDE SQLServer:Japanese_CI_AS ※Japanese_CI_AIも試しましたが同じでした。 ■.NET COBOLでは単純にSQL取得時にNAMEをOrderByしているだけでした。 ■SQLServerの照合順序もググって得た情報で数パターン試しましたが変わらず。 ■C#でLinqを使用しても同様でした。 ■LinqのOrderBy時にStrings.Strconvによる全角変換しても同様でした。 <C#> <NET COBOL> NAME NAME -------------------- --------------------- クロギアイコ クロキマユ クロギトミオ クロギアイコ クロキマユ クロギトミオ 以上、よろしくお願い致します。 追記 ■DBの照合順序 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/55e43a4b8a1d3a8c4489f316ecc1ffed.png) ■Order by にJapanese_bin2を指定しない結果 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/35cebb2ea34810278517193d7456a693.png) ■Order by にJapanese_bin2を指定した結果 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/586523ea649873239dec5f982fea1e12.png)
回答: まず、濁音の扱いですが、以下の記事を見てください。 日本語照合順序での 濁音、半濁音 の取り扱いについて 質問者さんのケースでは半角カタカナですが、上の記事 "SQL Server で 日本語照合順序を使用している場合、半角文字の後に濁音、半濁音を追加すると、”半角文字” + “濁音、半濁音” が 1 文字として認識されます" というところに注目してください。 なので、質問者さんのケースの "ギ" は、'キ' と '゙' という 2 つの文字として Order が決まるのではなく、濁音 1 文字として認識されるそうです。 そして、濁音がどのように扱われるかというと、以下の記事にありますように、濁点はアクセントとして扱われる(Order By では 'キ' と同じに扱われる)そうです。 SQL Server 2005 にて、照合順序設定:Japanese_CI_AS時での、濁点を含んだ時のOrder Byの仕様を教えて下さい。 つまり、Order By では濁点はないのと同じです。濁点がなければ期待した通りの結果ですよね? クロギアイコ ⇒ クロキアイコ クロギトミオ ⇒ クロキトミオ クロキマユ ⇒ クロキマユ > > .NET COBOLと同じような並びにするにはどうすればいいのでしょうか? > > > 上に紹介した後者の記事に書いてあるように、照合順序を Japanese_BIN2 とすれば、少なくとも質問者さんの例に限れば「.NET COBOLと同じ」になります。 全てのケースで完全に同じになるかどうかは分かりませんが。 Japanese_BIN2 とは何かについては以下の記事を見てください。 照合順序 – 文字の比較と並び順 (その 1) 【画像追加】 Japanese_CI_AS Japanese_BIN2