- PR -

LIKEでのあいまい検索

1
投稿者投稿内容
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2006-01-19 11:03
VB開発にてMS2000のSQLより、データを参照することを行っておりますが、問題にぶつかり、悩んでおります。お忙しい中、申し訳ありませんが、アドバイスをいただけないでしょうか。

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

■LIKEがうまく機能しない。

 テキストフィールドをKEYとした場合であいまい検索:LIKEで正常にレコードをとって きません。「全」とか「シ」などの全角文字、半角文字が全くダメです。

■SQL文(CoTB2は変数:テキストが入る)

 strSQL = "SELECT CSKS.KOSTL,CSKT.KTEXT,CSKT.LTEXT FROM CSKS " _
& "INNER JOIN CSKT ON (CSKS.MANDT = CSKT.MANDT) " _
& "AND (CSKS.KOKRS = CSKT.KOKRS) " _
& "WHERE (CSKS.MANDT = '100') " _
& "AND CSKS.KOKRS BETWEEN '1000' AND '9000' " _
& "AND CSKS.DATBI = 99991231 " _
& "AND CSKT.KTEXT LIKE" & "'%" & CoTB2 & "%'" _  ←ここがうまくいかない。
& "COLLATE Japanese_BIN" _
& " ORDER BY CSKS.KOSTL "

■今までにしてきた対応(どれもうまくできませんでした。)
 1.照合順序
   →COLLATE Japanese_BIN」や「COLLATE Japanese_CI_AS」を設定

 2.サービスパックの適用
   →最新番(SP4)

 3.「N」を付ける。
   →「"'%" & CoTB2 & "%'"」を「"N'%" & CoTB2 & "%'"」
   
 後は、US版で日本語を使用する時は、ntextやnvarchar等のUnicodeデータをサポート している型が良いというお話もありましたが、何をすれば良いのか、わかりません。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-01-19 12:25
どみのさんのおっしゃる駄目だったとは
『'ア'を含むデータを取得したいのに'ア'ではなく'あ'を含むデータも取得される』
ことを言っていますか?

#駄目だったといわれましても、何がどう駄目だったのか書いていないので
#とりあえず推測からいっています。

そのことだとした場合でですが、
照合順序を設定したらうまくいきましたが・・・
(といっても自分の環境はMSDE2000ですが)

参考までに、こちらで行った事をそのまま添付します。

コード:
6> create table test5
7>  ( col1 text collate Japanese_BIN )
8>
9>
10> insert into test5 values ('あいうえお') ;
11> insert into test5 values ('アイウエオ') ;
12>
13> go
(1 件処理されました)
(1 件処理されました)
1> select * from test5 ;
2> go
 col1
 --------------------
 あいうえお
 アイウエオ

(2 件処理されました)
1> select * from test5 where col1 like '%ア%';
2> go
 col1
 --------------------
 アイウエオ

(1 件処理されました)
1> select * from test5 where col1 like '%あ%';
2> go
 col1
 --------------------
 あいうえお

(1 件処理されました)

どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2006-01-20 11:03
おせわになります。
どみのです。

説明不足でもうしわけありませんでした。
「'ア'」と指定しても全く無関係なデータ
をとってきます。

ただ、「'C'」(半角)という半角英字を指定した場合は、
該当するものもとってきますが、無関係なものもとって
きます。
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-01-20 13:07
引用:

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


ごめんなさ、この照合順序を見落としていました。

MSDE2000SP4(USA版)で以下のことを試して見ました。
#test0の列に対しての照合順序を『SQL_Latin1_General_CP850_BIN』にしました。
コード:
create table test0
( id integer, col1 text collate SQL_Latin1_General_CP850_BIN  )
;

insert into test0 values (1,'あいうえお') ;
insert into test0 values (1,'アイウエオ') ;
insert into test0 values (1,'アイウエオ') ;
insert into test0 values (1,'aiueo') ;
insert into test0 values (1,'aiueo') ;
insert into test0 values (1,'AIUEO') ;
insert into test0 values (1,'AIUEO') ;


このテーブルに対してデータを取得すると以下のような内容に変わってしまいます。
コード:
select id,cast(col1 as text) from test0 ;
go
 id          col1
 ----------- --------------------
           1 ?????
           1 ?????
           1 ?????
           1 aiueo
           1 aiueo
           1 AIUEO
           1 AIUEO

(7 rows affected)


このことから、照合順序が日本語をサポートしていないので、
データを入れた時点で『A』なら『A』に
『あ』なら『?』へ変えてしまう処理が入っていると思います。

よって、変わってしまった後のデータに対して、LIKEをかけているので
うまく検索できないのではないかと思います。

上記はTEXT型で試しましたが、NTEXT版でやってみたところ
コード:
create table test01
( id integer, col1 ntext collate SQL_Latin1_General_CP850_BIN  )
;

insert into test01 values (1,'あいうえお') ;
insert into test01 values (1,'アイウエオ') ;
insert into test01 values (1,'アイウエオ') ;
insert into test01 values (1,'aiueo') ;
insert into test01 values (1,'aiueo') ;
insert into test01 values (1,'AIUEO') ;
insert into test01 values (1,'AIUEO') ;

3> select * from test01 ;
4> go
 id          col1
 ----------- ----------
           1 あいうえお
           1 アイウエオ
           1 アイウエオ
           1 aiueo
           1 aiueo
           1 AIUEO
           1 AIUEO

(7 rows affected)
1> select * from test01 where col1 like '%う%'COLLATE Japanese_BIN
2> go
 id          col1
 ----------- ----------
           1 あいうえお


となったので、NTEXT型では大丈夫のようですね。

なので対応としては
DB・テーブル・列の照合順序をJapanese_BINにするか、
照合順序はそのままでNTEXTにするかの
どちらかの対応になるかと思います。

#これは自分の環境で試したことなので、
#どみのさん自身の環境で入っているデータがどうなっているのか
#確認してください。
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2006-01-25 08:31
夏椰様

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

一応、一番、最初の記述に「Japanese_BIN」などの件は
うまく行かなかった旨を記述させて頂いているのですが・・・





_________________
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2006-01-25 08:43
引用:

どみのさんの書き込み (2006-01-25 08:31) より:
...
一応、一番、最初の記述に「Japanese_BIN」などの件は
うまく行かなかった旨を記述させて頂いているのですが・・・


夏椰さんの記述は、
マスターDBを「Japanese_BIN」にするという意味では?
_________________
IEEE-CSDP 2004-2007
どみの
会議室デビュー日: 2005/12/15
投稿数: 16
投稿日時: 2006-01-25 09:02
おせわになります。

確かに、そうですね。
DB設定のアドバイスですね。
大変、申し訳ありませんでした。

それでは、また質問をさせてください。

■質問
 1.DB側を「Japanese_BIN」にしてしまうことによる、他の
   弊害は考えられないのでしょうか?
   つまり、現在、うまく動作している部分に影響が出るような・・・
   現在のDBはERPパッケージのデータベースシステムなので
   DB側の設定を変えるのが不安なのですが・・・

 2.NTEXTについて
   これも、DB側の設定なのでしょうか?
   また、どのような対応になるのでしょうか。

お忙しい中、申し訳ありませんがよろしくお願い致します。
_________________
今川 美保(夏椰)
ぬし
会議室デビュー日: 2004/06/10
投稿数: 363
お住まい・勤務地: 神奈川県茅ヶ崎市
投稿日時: 2006-01-25 11:31
引用:

どみのさんの書き込み (2006-01-25 09:02) より:
 1.DB側を「Japanese_BIN」にしてしまうことによる、他の
   弊害は考えられないのでしょうか?
   つまり、現在、うまく動作している部分に影響が出るような・・・
   現在のDBはERPパッケージのデータベースシステムなので
   DB側の設定を変えるのが不安なのですが・・・
 2.NTEXTについて
   これも、DB側の設定なのでしょうか?
   また、どのような対応になるのでしょうか。

お忙しい中、申し訳ありませんがよろしくお願い致します。




何をするにしてもDBをいじるのであれば
データのバックアップ(とリストア)をする必要性が出てくるのは認識してください。

照合順序を設定できる場所が複数箇所あります。
http://msdn2.microsoft.com/ja-jp/library/ms143508.aspx

DB全体の照合順序を変える場合、マスタの作り直しという作業になります。
また照合順序を変えているので、
テストも実施したほうが良いかと思います。

DB全体の照合順序はこのままで・・・という対応にする場合、
テーブル列にも照合順序を設定できるので、
任意テーブル列に設定していくことになると思います。
これは照合順序そのままでTEXT型→NTEXT型も同じ感じですかね。

ALTER TABLEで列定義を変更する際、照合順序も設定できますが
今回はTEXT型の列ということで、ALTER TABLEは使えません。
よって、テーブル定義のしなおしということになると思います。

異なる照合順序間でのデータコピーに関してはこちらが参考になると思います。
http://www.microsoft.com/japan/developer/library/adminsql/ad_impt_bcp_1y43.htm
1

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