質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Oracle Database 10g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

解決済

半角の「濁音なし」「濁音あり」カナのソート順について

cutedog
cutedog

総合スコア177

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Oracle Database 10g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。

2回答

0グッド

2クリップ

11065閲覧

投稿2017/09/02 14:53

編集2017/09/04 06:49

現在、.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の照合順序
イメージ説明

■Order by にJapanese_bin2を指定しない結果
イメージ説明

■Order by にJapanese_bin2を指定した結果
イメージ説明

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

sazi

2017/09/03 00:37

oracleとSQLServerで使用している文字コードも追記した方がいいですね。
cutedog

2017/09/03 04:58

すいません。今わかる範囲で追記しました。

回答2

3

ベストアンサー

まず、濁音の扱いですが、以下の記事を見てください。

日本語照合順序での 濁音、半濁音 の取り扱いについて
https://blogs.msdn.microsoft.com/jpsql/2014/12/11/2353/

質問者さんのケースでは半角カタカナですが、上の記事 "SQL Server で 日本語照合順序を使用している場合、半角文字の後に濁音、半濁音を追加すると、”半角文字” + “濁音、半濁音” が 1 文字として認識されます" というところに注目してください。

なので、質問者さんのケースの "ギ" は、'キ' と '゙' という 2 つの文字として Order が決まるのではなく、濁音 1 文字として認識されるそうです。

そして、濁音がどのように扱われるかというと、以下の記事にありますように、濁点はアクセントとして扱われる(Order By では 'キ' と同じに扱われる)そうです。

SQL Server 2005 にて、照合順序設定:Japanese_CI_AS時での、濁点を含んだ時のOrder Byの仕様を教えて下さい。
https://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/729f1bef-ae99-4f98-977d-94f5986e9d8c/sql-server-2005-japaneseciasorder-by?forum=sqlserverja

つまり、Order By では濁点はないのと同じです。濁点がなければ期待した通りの結果ですよね?

クロギアイコ ⇒ クロキアイコ
クロギトミオ ⇒ クロキトミオ
クロキマユ ⇒ クロキマユ

.NET COBOLと同じような並びにするにはどうすればいいのでしょうか?

上に紹介した後者の記事に書いてあるように、照合順序を Japanese_BIN2 とすれば、少なくとも質問者さんの例に限れば「.NET COBOLと同じ」になります。

全てのケースで完全に同じになるかどうかは分かりませんが。

Japanese_BIN2 とは何かについては以下の記事を見てください。

照合順序 – 文字の比較と並び順 (その 1)
https://blogs.msdn.microsoft.com/jpsql/2016/07/26/1-3/

【画像追加】

Japanese_CI_AS
http://surferonwww.info/blogengine/image.axd?picture=2017%2f9%2fJapanese_CI_AS.jpg

Japanese_BIN2
http://surferonwww.info/blogengine/image.axd?picture=2017%2f9%2fJapanese_BIN2.jpg

投稿2017/09/03 06:01

編集2017/09/04 04:17
SurferOnWww

総合スコア17328

Tokeiya3, x_x, cutedog👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

cutedog

2017/09/04 03:39

回答ありがとうございます。 申し訳ないです。 この記事は以前にググって見つけており 照合順序をJapanese_BIN2に変更して実行を行ってみたのですが 並び順は以前と変わらずでした。 記事を見つけたときは、これだー!って思ったんですけどね。 もう、1年近く前からの問題で、先送りしていたので やっていたことをすっかり失念していました。 BINの付く照合順序を他にも何個か試しように思います。 でも、記事通りだと並び替えされそうなものなんですが・・・ 照合順序の変え方に問題ありなんですかね? https://docs.microsoft.com/ja-jp/sql/relational-databases/collations/set-or-change-the-database-collation ↑↑のとおり、一応、再起動も挟んで DB再起動=>オプションで変更後=>DB再起動した後に 実行しているんですけど。
SurferOnWww

2017/09/04 04:23

> 照合順序をJapanese_BIN2に変更して実行を行ってみたのですが並び順は以前と変わらずでした。 そんなことはないはずですが。 自分の環境、SQL Server 2008 Express で nvarchar(50) のフィールドで試してみましたが、Japanese_BIN2 で質問者さんの期待通りになりました。 証拠画像のリンクを回答欄に貼っておきますので見てください。(自分はこのサイトには直接画像が貼れないので、自分のサーバーに画像をアップしてそれへのリンクを張っておきました)
cutedog

2017/09/04 04:59

拝見しました。ありがとうございます。 SQLmanagementで直接SQLを書いてもダメでしたが Order by句に collate japanese_bin2を付けると 期待した結果になりました。 データベース自体の照合順序だとどうしてダメなんだろうか?? DBFlute.NETっていうもの使ってまして、Order by句に 付加できないんですよね。 再構築という意味でテーブルクリエイトからやり直さないと ダメなのかもしれませんね。。 データ移行も必要だから、ちょっと大変だなあ・・・
SurferOnWww

2017/09/04 06:29

> データベース自体の照合順序だとどうしてダメなんだろうか?? テーブルの照合順序が Japanese_BIN2 になっていないのでは? なっていれば collate japanese_bin2 をつけなくても絶対間違いなく期待した結果になるはずです。照合順序を確認して下さい。 照合順序が Japanese_BIN2 でもダメということですと、質問者さん固有の問題(DBFlute.NET の影響とか?)だと思います。そうだとすると、第三者は何故ダメかなんて知る由もありません。 もし、第三者が知り得ない質問者さん固有の何かがあるなら、質問する前にそれらの影響を完全に排除して、その上で検証してから質問いただければと思います。
cutedog

2017/09/04 06:50

SQLmanagementでの結果なので DBFlute.NET は関係ないと思います。 質問のところに画像リンクを追加しました。
cutedog

2017/09/04 06:55

あー、わかりました。 テーブルの列にも照合順序なんてあったんですね。 確かに確認したらJapanese_BIN2ではなかったです。 これってALTERか、DBの照合順序変えたあとに 再度クリエイトしないとダメってことですね。
SurferOnWww

2017/09/04 07:52 編集

原因が分かってよかったです。 自分も SSMS を使って照合順序の変更を試してみましたが、DB の照合順序を変更すると、その配下のテーブルの照合順序も変更されるものの、テーブル内の列の照合順序は元のまま変わらなかったです。そこに気が付かなかったということのようですね。
cutedog

2017/09/05 01:53

ありがとうございます。 おかげさまで照合順序の原因が判明し助かりました。 あとはLinqでのGroupByなのですが これはseastar3さんの言う通りなのでしょうね。
SurferOnWww

2017/09/05 03:30 編集

> あとはLinqでのGroupByなのですが GroupBy ではなくて OerderBy ですよね? カスタム Comparer を定義し、それを使えば何とでもできるはずです。以下の記事の例を見てください。 http://www.java2s.com/Code/CSharp/LINQ/OrderBywithcustomizedComparer.htm 問題は Compare メソッドの実装ですが、String.CompareOrdinal メソッド(それぞれの文字列の対応する Char オブジェクトの数値を評価することで、2 つの String を比較)が使えそうな気がします。(気がするだけで未検証・未確認です)
SurferOnWww

2017/09/05 04:49

検証しました。String.CompareOrdinal メソッドで期待通りの結果(collate japanese_bin2 と同じ)が得られます。 Linq の話は本題(SQL Server の order by と照合順序)とズレてきているようですので、もし Linq について詳しい話をしたいということであれば、新たに別のスレッドを立てて質問していただけると幸いです。(後で検索などでここにたどり着いた人が読んで分かりやすくする為に)
cutedog

2017/09/05 04:56

ありがとうございました。 ちょっとLinqの事は私のスキルでは敷居が高いようなで別スレッドを立てますので どのようにすれば良いか教えてもらいたいと思います。
cutedog

2017/09/05 06:11

スレッド立てましたが SurferOnWwwさんの回答を元に調べて 以下のコードの書き方でやると濁点が後に並ぶようになりました。 SurferOnWwwさんのやり方とあっていますか? ■コードの書き方  list.OrderBy(x => x.Hiknmk, StringComparer.Ordinal).ToList();

1

エクセルでの五十音順(あいうえお順)の並べ替えについて の記事から類推するとマイクロソフト社製のアプリにおいて、半角文字の濁音がExcelでもエスケーブシーケンス文字のように特別に扱われるようです。
SQL serverでも同様だとしたら、ソート用に
translate(NAME2,'゙','ン ')
のように濁点を半角の'ン 'に置き換えた関数値なり新フィールドを使って並び替えるとできるのではないでしょうか。

投稿2017/09/02 21:29

編集2017/09/02 21:31
seastar3

総合スコア2285

cutedog👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

seastar3

2017/09/04 00:14 編集

ただ、このままでは カン ヨシコ より前に ガモン サトル => カン モン サトル がきてしまいますね。変換先の文字にもう一工夫必要です。 工夫してみて下さい。
cutedog

2017/09/03 05:05

ありがとうございます。 投稿前に、この置き換えの方法も検討したのですが 何に置き換えればいいかがわからず断念しました。 リンク先の回答がヒントになるかもですね。 再度考えてみます。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Oracle Database 10g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

COBOL

COBOL(COmmon Business Oriented Langage)は、実務処理用に開発されたプログラミング言語です。