- PR -

SQL_Latin1_General_CP850_BINについて

1
投稿者投稿内容
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2005-12-20 12:48
前にも同様なメッセージを記述させて頂きましたが、また質問させていただきました。

B開発にてMS2000のSQLより、データを参照することを行っておりますが、問題にぶつかり、悩んでおります。お忙しい中、申し訳ありませんが、
アドバイスをいただけないでしょうか。


SQL:MS(マイクロソフト)SQLServer2000(英語版)
接続方法:ADO
 データベースの照合順序:SQL_Latin1_General_CP850_BIN


 テキストフィールドをKEYとした場合で「あいまい検索:LIKE」が「@正常に
機能する場合」と 「A機能しない場合」があり、当然ながらAについて
悩んでおります。 「うまくいかない」というのは「該当するレコードが無い」
という状態になるという意味です。

■1.LIKEの指定
   以下のように検索値を「変数A」とし、後の2,3のように変数を設定して
   おりその内容によって、@、Aのようにケースが分かれます。

   strSQL = "SELECT フィールド名 FROM テーブル名 " _
  & "WHERE フィールド名(Key) LIKE " _
  & "'[" & 変数A & "-" & 変数A & "]%'"
 
 ■2.正常に機能する場合@
   上記「1」のSQL文を実行する前に、以下のように半角英数字を1文字
   指定。この場合は、正常に該当レコードをとってきます。
   
 変数A = "A"("3"でも可)

 ■3.正常に機能しない場合A
   上記「1」のSQL文を実行する前に、以下のようにカナや全角文字を
   1文字指定。この場合は、正常に該当レコードをとってきません。
   (該当なし)

   変数A = "ア" ("あ"、"全"、"5"、"B"などの全角文字も全て不可)

   cf:LIKEの後、以下のような他の指定も半角であっても機能しません
   でした。
     ・'%変数A%'
     ・'___変数'

ちなみに以下のように「COLLATE Japanese_BIN」で指定すると条件には
一致しない無関係なレコードが抽出されました。
「COLLATE Japanese_CI_AS」でも全く同じ結果でした。

strSQL = "SELECT CSKS.KOSTL,CSKT.KTEXT,CSKT.LTEXT FROM CSKS " _
& "INNER JOIN CSKT ON (CSKS.MANDT = CSKT.MANDT) " _
& "AND (CSKS.KOKRS = CSKT.KOKRS) " _
& "AND (CSKS.KOSTL = CSKT.KOSTL) " _
& "AND (CSKS.DATBI = CSKT.DATBI) " _
& "WHERE (CSKS.MANDT = '100') " _
& "AND CSKS.KOKRS BETWEEN '1000' AND '9000' " _
& "AND CSKS.KOSTL BETWEEN '000000' AND 'ZZZZZZ'" _
& "AND CSKS.DATBI = 99991231 " _
& "AND CSKT.KTEXT LIKE" & "'%" & CoTB2 & "%'" _
& "COLLATE Japanese_BIN" _
& " ORDER BY CSKS.KOSTL "

_________________
さいた
会議室デビュー日: 2004/06/27
投稿数: 10
投稿日時: 2005-12-20 14:27
シングルクォートの前にNをつけては如何ですか?
例としてはこんな感じ。

select * from tbl where fld like N'%あ%'

それから、既にそうなっていらっしゃるかもですが、US版で日本語を使用する時は、ntextやnvarchar等のUnicodeデータをサポートしている型が良いと想います。
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2005-12-20 15:09
さいた様

おせわになります。
どみのです。

アドバイスありがとうございます。

1.シングルクォートの前にNつけるについて。
 対応してみたのですが、失敗しました。
 該当なしになってしまいました。

2.ntextやnvarchar等のUnicodeデータをサポートしている型
 おはずかしい話ですが、どのようにプログラム内で記述すれば
 良いのか、よくわかりません。
 もし、よろしければ、教えて頂けないでしょうか。

大変、お忙しい中、申し訳ありませんがよろしくお願い致します。
さいた
会議室デビュー日: 2004/06/27
投稿数: 10
投稿日時: 2005-12-20 20:19
どみの様、
すみません、自分もUS環境で同じ様な状況になり、よく焦る事があるのでNのつけ忘れかな、と思いサクリと書き込んでしまいました。
自分の使っているSQLは、コレーション等はいつもDefaultなので、もしかしたら当てはまらない可能性があるかもしれません。もし、お時間の無駄になってしまったらすみません<(__)>

1.について。
もしテーブルの列のデータ型がUnicode対応ではない、CHAR/VARCHAR/TEXTの場合、Nをつけてもヒットしないと思います。
確認方法は、SQLServerのエンタープライズマネージャやクエリアナライザで見れます。

2.について。
nvarcharやntextはテーブルの列の型なので、通常はテーブルを作成する時に指定します。
また、このテーブルにデータを挿入する際も、シングルクォートの前に N が必要です。

テーブルの作成とデータの挿入、検索のミニサンプルは以下の通りです

create table T1 ( F0 int primary key, F1 NText)
insert into T1 values( 1, N'あああ')
insert into T1 values( 2, N'あいう')
insert into T1 values( 3, 'あいう')
select * from T1 where F1 like N'%い%' -- F0=2のデータだけヒットします
select * from T1 -- F0=3のデータは、F1が ??? になってしまいます

自分の環境では↑で期待通りに動作しました。
もしお時間あれば、この様な小さなサンプルで御確認頂けたらと思います。

ただ、原因がこれだとすると、検索でヒットする、しないにかかわらず、まず日本語の文字がちゃんと見えないのでは?と思います。(クライアントがUS環境ですと、どちらにしても見れない可能性がありますが)
なのでお役に立てれば嬉しいのですが、もしかすると本当にアテハズレかもしれません(汗;。
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2005-12-21 07:33
さいた様

おせわになります。
どみのです。

アドバイスありがとうございます。

1.について
 おそらくUnicodeです。

2.について
 基本的には、テーブル参照しか考えていないのですが・・・
 確かに、テーブルの中をみると「nvarchar」という型
 が、存在しました。

3.その他
 確かにおっしゃるとおり、最初は、テキスト項目が文字化け
 して日本語が見えない状態でした。
 そこで、いろいろ試した結果、以下の設定を施すと、日本語
 が正常に表示されるようになりました。
 ですから、もしかすると、また、これと似通ったの設定をすれ
 ば良いのでは?とも考えたのですが、対応方法が全くわからず
 悩んでおります。この指摘をされた、さいた様はスゴイと思い
 ます。

 cn.open "Provider=SQLOLEDB ;Server=Servar1;Database=DB1;Persist Security
 Info=TRUE;User ID=sa;@Auto Translate=False;Current Language=Japanese;"

 @の「Auto Translate」を「False」にすると日本語表示ができるように
  なりました。
さいた
会議室デビュー日: 2004/06/27
投稿数: 10
投稿日時: 2005-12-21 18:15
プロバイダの接続オプションで表示できる様になりましたか!
なるほど!自分も勉強になりました<(__)>
1

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