2016-03-29 5 views
4

私はオンラインショップを作成しました。私は検索機能に問題があることに気付きました。 ユーザーが検索する文字列を入力すると、私はSELECT * FROM PRODUCTS WHERE DESCRIPTION LIKE %....%MySQL - 特別な文字の有無を問わず、レコードを検索

この問題は解決しますが、特殊文字に問題があります。私が "préparé"や "côteàl'os"のような製品を持っているとしましょう。ユーザーが「準備する」または「書いてください」を検索すると、製品は見つからないが、そこには製品があります。

他にも問題があります。ユーザーが "dûroc"を検索しても、私の製品がデータベースに "duroc"としてある場合、彼はそれを見つけられません。

また、次のようなものもあります。ユーザーが「準備中」または「コートジムス」を検索します。

この問題を解決する方法、または少なくともそれを小さくする方法はありますか?

のMySQL 5.1.73/PHP 5.6


UPDATE

私は与えられた答えを読んだ後、いくつかの余分なテストを行なったし、私はいくつかの余分な詳細を与えることができます。 MySQL WorkbenchやSequel Proなどのツールを使用すると、すべてうまく動作します。だからSELECT * FROM PRODUCTS WHERE DESCRIPTION LIKE '%prepare%'またはSELECT * FROM PRODUCTS WHERE DESCRIPTION LIKE '%preparé%'を実行できます。彼らは両方の記述に "準備"、 "プリペル"または "準備"が含まれているすべてのレコードを返す。 SQL Serverはこれをテストしていないため、MySQLがこれを行ったのかどうかはわかりませんでした。

次にサイトに戻ってください。ユーザーが「準備」とタイプすると、それでもうまくいって、すべてのレコードが上記のように返されます。 しかし、ユーザーが「準備」と入力すると、何も返されません。説明に「準備」が含まれているものさえも返しません。

これは私が使用してPHPでのクエリです:

$qryPLU = sprintf(SELECT * FROM PRODUCTS WHERE DESCRIPTION LIKE "%%%s%%", $conn->real_escape_string($mywgid)); 

私はこれをエコーするとき私が手:

SELECT * FROM PRODUCTS WHERE DESCRIPTION LIKE '%PREPARé%' 

だから、どこかに私は思うéが変更されたデータベースへのそれのようにして、しかし、私は、どのように、どこで、なぜか分からない。

何とか@リバーサルが私が今見ている正しい方向になっていました。

+1

方法についてデータベースを照会する前に検索用語を解析していますか?あなたは 'é=> e、ô=> o'のようないくつかの置換を行い、すべての可能な方法でそれらを結合し、作成されたすべてのキーワードを使ってDBに問い合わせます。 – Reversal

+2

特殊文字をすべてアンダースコア '_'で置き換えることもできます。これは、任意の1文字に一致する特殊文字です。 – Reversal

+0

私と一緒に考えるTnx。私もこのように考えてきましたが、問題はそれを逆転できないことです。ユーザーが「準備」を検索し、DB内に「préparé」と答えた場合、これは失敗します。 – diedie2

答えて

1

はあなたにこのようなiconvを持つISO-8859-1にPHPの変数/パラメータを変換しよう:

iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $variable) 
1

これは、charsetcollationに関連している可能性があります。

mysql> set names latin1; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select 'préparé' like '%prepare%'; 
+------------------------------+ 
| 'préparé' like '%prepare%' | 
+------------------------------+ 
|       0 | 
+------------------------------+ 
1 row in set (0.00 sec) 

mysql> set names utf8; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select 'préparé' like '%prepare%'; 
+------------------------------+ 
| 'préparé' like '%prepare%' | 
+------------------------------+ 
|       1 | 
+------------------------------+ 
1 row in set (0.00 sec) 
+1

ちなみに、私はこの動作を複製することはできませんので、バグ(おそらくマイクロソフトのマシンに関連している) – Strawberry

+0

かもしれません。私のデフォルトの名前は 'utf8mb4'です –

+0

私のために働く唯一のものはutf32ですが、コマンドラインではアクセント付きの文字が '?' – Strawberry

1

これは私のために働くと思われるものである:

SELECT _utf32 'préparé' = _utf32 'prepare' collate utf32_general_ci; 
+--------------------------------------------------------------+ 
| _utf32 'pr?par?' = _utf32 'prepare' collate utf32_general_ci | 
+--------------------------------------------------------------+ 
|               1 | 
+--------------------------------------------------------------+ 

select _utf32 "côte à l'os" = _utf32 "cote a l'os" collate utf32_general_ci; 
+----------------------------------------------------------------------+ 
| _utf32 "c?te ? l'os" = _utf32 "cote a l'os" collate utf32_general_ci | 
+----------------------------------------------------------------------+ 
|                 1 | 
+----------------------------------------------------------------------+ 
関連する問題