• ベストアンサー

検索機能を作成しています。

検索機能を作成しています。 データベースに”絵コンテ”というデータが登録されており、”絵コンテ”でマッチングを行えば問題なく一致しますが、”コンテ”でマッチングをしようと思えば一致がないと言ってきます。 DBはMySQLで、言語はPHPを使用しています。 DBにはそこそこの件数がありますので、DBのデータをできれば加工したくありません。 どういう原因が考えられますでしょうか?また解決策はどういったものになりますでしょうか? ぜひよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
noname#140045
noname#140045
回答No.3

No.2です。 ゴメンなさい。 LIKE '%コンテ' でした。

fabu
質問者

お礼

MySQL4.0以下では日本語はバイナリ列と同程度の扱いだったようで、以下で解決しました。ありがとうございました。 1)SELECT a FROM b LIKE BINARY 'ABC'; 2)SELECT a FROM b WHERE target LIKE '%~%' ではなくて、 SELECT a FROM b WHERE target REGEXP '~'

その他の回答 (2)

noname#140045
noname#140045
回答No.2

SQL言語はある程度仕様が決められているため、部分一致は共通で「%」です。 "%コンテ"で検索すればいいでしょう。

参考URL:
http://www.yc.tcu.ac.jp/~yamada/doc/mysql/win/0611.html
fabu
質問者

お礼

ご回答ありがとうございます。 WHERE フィールド名 LIKE "'%{$str}%" と変数は{}で囲う必要があるようですね。 単純にaddslashesの動作に問題がありそうだなと、今頃気になってきました。。。

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

今現在、どういうSQL文を発行しているのか位書きましょうよ…。

fabu
質問者

補足

汚いソースで申し訳ありません。 $keyword = split(' ', $keywords); //キーワードを配列に入れる $sql_column = array('title','contents','more','excerpt'); $sql_result = 'count(distinct no) AS s_num'; $sql_table = 'blog_article'; $sql_cond = ' AND blog_no = ' . $blog_no; if($keywords){ $sql = "select $sql_result from $sql_table"; $where = ''; foreach ($keyword as $item) { if (trim($item) == '') { continue; } if ($where == '') { $where = ' where('; } else { $where .= 'and'; } $where .= '('; foreach ($sql_column as $column) { $where .= "($column like '%" . addslashes(trim($item)) . '%\')'; $where .= 'or'; } $where = substr($where, 0, strlen($where)-2); $where .= ')'; } if ($where != '') { $where .= ') '; } $sql .= $where; $sql .= $sql_cond; $result_c = mysql_query ($sql); $data_c = mysql_fetch_array ($result_c); $search_num = $data_c["s_num"]; } else { $search_num = 0; } 絵という文字の文字コードに\が含まれていて、前後文字の文字コードが変になる等の 文字コードの問題かと推測していました。 書き込むと、アルゴリズムが悪さをしているようにも感じてきました。。。