- PR -

.NET環境とORACLEで文字列比較の動作に相違あり。

投稿者投稿内容
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 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
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-09-13 21:59
Oracle は全く知りませんが、SQL Server でいう照合順序というものがあるでしょう。
Oracle では「NLS」というのかな?
文字コードとは話が全く違います。

String.Compare はカルチャを指定できるオーバーロードもあるので、あるいは同じ順序で比較できる場合もあるかもしれませんが、どちらか一方しか使わなきゃ済む問題というわけでもないですか?

_________________
囚人のジレンマな日々
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 2006-09-13 22:00

補足です。

Aテーブルは、約3000件
Bテーブルは、最大150000件のデータとなります。

A,Bテーブルを、SQL文では紐付けられない
副要素があるため、分割した状態でプログラムで紐付けています。

またDataSetでのSort(DataView!?)は、件数からして
処理に時間がかかると思い、できれば避けたいと思っています。

最大件数でのテストはしていないので、
別対策があればと思っています。
最終手段として、DataSetのSortで並び変えようと思っています。

宜しくお願いします。
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 2006-09-13 22:12
囚人さん、返信ありがとうございます。

トピックの投稿がずれてしまい、失礼しました。

SqlServerは便利そうな機能がありますね。
照合順序について、ちょっと調べてみましたが
Oracleには無さそうな気がしました。→明日、調べてみます。
String.Compareでも同じく。

>どちらか一方しか使わなきゃ済む問題
申し訳ありません。意味が分かりませんでした。
どういった意味で一方って事でしょうか?
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2006-09-13 22:38
ソートはデータベースかアプリどちらかで行えということ
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-09-13 22:43
引用:

SqlServerは便利そうな機能がありますね。
照合順序について、ちょっと調べてみましたが
Oracleには無さそうな気がしました。→明日、調べてみます。


いや、NLS がそうですよね?

引用:

>どちらか一方しか使わなきゃ済む問題
申し訳ありません。意味が分かりませんでした。
どういった意味で一方って事でしょうか?


引用:

ソートはデータベースかアプリどちらかで行えということ


という事です。

_________________
囚人のジレンマな日々
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2006-09-13 23:00
別々に取得した A と B を関連付けるだけなら、
HashTable を使ってもよいのではないですか?
さく
ベテラン
会議室デビュー日: 2004/06/11
投稿数: 74
投稿日時: 2006-09-14 23:17
囚人さん、七味唐辛子さん、masaさん

返信ありがとうございました。

囚人さんのアドバイスが、ほとんど答えだったなって
思いつつ、2行ほどコードを変更しただけで
解決しました。

NLSSORTでした。

多謝。

>ソートはデータベースかアプリどちらかで行えということ
に関してですが、SQLを発行した時点で
ORDER BY でソート済みとして考えていました。
これが、辞書式の並びになっているものと思っていたのが
思い違いでした。

order by の時点で、辞書式の並びにしてくれてもいいような
気がしたのですが、なぜでしょう?
そういう仕様なのだと自分自身に納得させましたが

それから、HashTableは既にDataSetを使っていたため
大幅な修正となってしまうため、対策からは外してました。
比較しつつ、いろんな処理を一度にやっていたので。

改めて多謝。

スキルアップ/キャリアアップ(JOB@IT)