- - PR -
.NET環境とORACLEで文字列比較の動作に相違あり。
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-09-13 21:10
件名で対策をご教示下さい。
2つのテーブルから、それぞれソート順を指定してSQL文を発行。 AテーブルをベースにBテーブルのデータを紐付け。 紐付け時は、1回のループでできるように辞書検索式のアルゴリズムで 処理を行いました。 問題となっている現象を例で示します。 テーブル名を、それぞれA,Bとします。 ソート順は、キー値です。 AテーブルのSELECT文を発行した時、 次のような順でデータを取得します。 HRS-R-1 HRS-R-2 HRS-R-3 .... BテーブルのSELECT文を発行した時、 次のような順でデータを取得します。 HR-R-1 HRS-R-1 HRS-R-2 HRS-R-3 .... Bテーブルのデータを、Aテーブルに紐付けます。 アルゴリズムで文字列比較(String.Compare())で 文字列の大小を比較します。 オラクルからデータを取得した時は、並び順からして HR-R-1 < HRS-R-1となりますが、(←この考えが間違っている!?) プログラム上で、String.Compare()で比較した時は、 HR-R-1 > HRS-R-1 となってしまいました。 Bテーブルのデータ移動が思った通りにいきませんでした。 「-」があるのとないとでは結果がまちまちでした。 Oracleの文字コードを NLS_PARAMETER(記憶で書いているため 正確なスペルは忘れましたが。。。)で取得した所、 US7ASCUたるものが帰ってきました。 .NET環境化では、UTF-8が文字コードだったと思っています。 文字コードの違いで、アルゴリズムが動作しないと 推定しているのですが、対策が分かりません。 (上記、勘違いがあれば指摘をお願いします。) Oracleサーバは、別システムも動作しているため、 文字コードの変更は不可です。 オラクルから取得したデータは、それぞれ DataSetに格納した状態です。 以上、ご教示お願いします。 環境:Oracle WindowsXp 言語:C# 2003 | ||||||||||||
|
投稿日時: 2006-09-13 21:59
Oracle は全く知りませんが、SQL Server でいう照合順序というものがあるでしょう。
Oracle では「NLS」というのかな? 文字コードとは話が全く違います。 String.Compare はカルチャを指定できるオーバーロードもあるので、あるいは同じ順序で比較できる場合もあるかもしれませんが、どちらか一方しか使わなきゃ済む問題というわけでもないですか? _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2006-09-13 22:00
補足です。 Aテーブルは、約3000件 Bテーブルは、最大150000件のデータとなります。 A,Bテーブルを、SQL文では紐付けられない 副要素があるため、分割した状態でプログラムで紐付けています。 またDataSetでのSort(DataView!?)は、件数からして 処理に時間がかかると思い、できれば避けたいと思っています。 最大件数でのテストはしていないので、 別対策があればと思っています。 最終手段として、DataSetのSortで並び変えようと思っています。 宜しくお願いします。 | ||||||||||||
|
投稿日時: 2006-09-13 22:12
囚人さん、返信ありがとうございます。
トピックの投稿がずれてしまい、失礼しました。 SqlServerは便利そうな機能がありますね。 照合順序について、ちょっと調べてみましたが Oracleには無さそうな気がしました。→明日、調べてみます。 String.Compareでも同じく。 >どちらか一方しか使わなきゃ済む問題 申し訳ありません。意味が分かりませんでした。 どういった意味で一方って事でしょうか? | ||||||||||||
|
投稿日時: 2006-09-13 22:38
ソートはデータベースかアプリどちらかで行えということ
| ||||||||||||
|
投稿日時: 2006-09-13 22:43
いや、NLS がそうですよね?
という事です。 _________________ 囚人のジレンマな日々 | ||||||||||||
|
投稿日時: 2006-09-13 23:00
別々に取得した A と B を関連付けるだけなら、
HashTable を使ってもよいのではないですか? | ||||||||||||
|
投稿日時: 2006-09-14 23:17
囚人さん、七味唐辛子さん、masaさん
返信ありがとうございました。 囚人さんのアドバイスが、ほとんど答えだったなって 思いつつ、2行ほどコードを変更しただけで 解決しました。 NLSSORTでした。 多謝。 >ソートはデータベースかアプリどちらかで行えということ に関してですが、SQLを発行した時点で ORDER BY でソート済みとして考えていました。 これが、辞書式の並びになっているものと思っていたのが 思い違いでした。 order by の時点で、辞書式の並びにしてくれてもいいような 気がしたのですが、なぜでしょう? そういう仕様なのだと自分自身に納得させましたが。 それから、HashTableは既にDataSetを使っていたため 大幅な修正となってしまうため、対策からは外してました。 比較しつつ、いろんな処理を一度にやっていたので。 改めて多謝。 |