2017-04-13 11 views
1

アクセント記号付きの文字を使用する言語で多く働いています。 é。私は "utf_8_bin"エンコードされたテーブルにコンテンツを格納し、アクセント付き文字もHTMLエンティティに変換します。PHP/SQL:データベースに格納されているHTMLエンティティを検索する

例えば、 "Términator"はデータベース内に "T & eacute; rminator"(オンラインでのレンダリングを停止するためのスペースがあった)として保存されます。

ユーザーが "términator"を検索すると、クエリもHTMLエンティティに変換され、SQLクエリは "lcase"の引数の両側に "lowercase"するため、一致が見つかります。

私が今問題にしているのは、クライアントが "Términator"と一致する結果を得るために "Terminator"( "e"のアクセントなし)を検索できるようにすることです。

私は自分のデータを保存する方法を変更しないことをお勧めします。特に、HTMLエンティティを保存すると他の多くの問題が解決されるためです。だから私は、より簡単な解決策があるかどうかを尋ねている。ありがとう!あなたが使用

+1

との素敵な例は次のような演算子を使用してみましたか?また、その要件を満たすためにデータを二重に保存する必要があります。 1つは現状で、もう一度はアクセントなどで削除されました。 –

+0

おそらく両方のlevenshteinを比較するか、それと似たようなことがあるかもしれません...このプロジェクトのために大きなデータベースを用意する予定ですか? – Shane

+0

@SloanThrasher - like演算子を使用しています:lcase( 'T&eacuterminator')はlcase( '%content%')のようになります。内容は実際には完全な記事です。データを二重に格納することは、かなり実現可能な解決策です - 私は別の解決策が見つからない場合、そのことを検討します。ありがとう。 – NadeemH

答えて

2

あなたはutf8_unicode_ciあなたのケースでは、あなたのクエリで正しい照合を使用する必要があります(これは、HTMLエンティティなしで)

https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-sets.html

この照合は、あなたが戻ってあなたのデータベースから取得結果を決定します。そしてその文字がどのように比較されるか。

SELECT * FROM some_table WHERE title LIKE "Terminator" COLLATE utf8_unicode_ci 

このクエリーは、タイトルtérminatorTerminatorなどのレコードを返します、それは大文字小文字を区別しない比較(照合で_ci部分)はないことに注意してください。

utf8_unicode_ciは少し遅くなっていますが、それは実際にはごくわずかですが、その違いに気付かないことさえあります。

htmlエンティティに使用できる照合があるかどうかわからない、必要以上の照合があります。あなた自身の照合をmysqlデータベースに追加して、htmlentitiesを自分で作成することができます。utf8_htmlentities_ciなどです。 https://dev.mysql.com/doc/refman/5.7/en/adding-collation.html

は、ここで電話番号https://dev.mysql.com/doc/refman/5.7/en/ldml-collation-example.html

+0

これは良い答えです。しかし、実際にはHTMLエンティティをDBに格納しているため、物事が起きてもユーザーにとってはうまくいかないでしょう。これは間違っています。 HTMLエンティティはデータベースに格納しないでください。データベースには、実際の文字がテキストに含まれている必要があります。 HTMLコンテンツに出力する時点でのみ、エンティティを含むようにテキストを変換する必要があります。 DB内のエンティティを持つことで、適切な検索機能が無効になります。また、HTML以外の形式に出力する必要がある場合は、問題が発生します。 – Simba

+0

私はあなたがデータベースにhtmlエンティティを保存すべきではないことに同意します。それは、それが解決するより複雑な問題を作り出します。 htmlentitiesを元の文字に戻す優れたデータベース移行が最適なソリューションです。 –

+0

私は少し仕事があるように見えます。私は実際にこれを進めます:htmlエンティティなしでコンテンツを移行してから、提案された照合を検索に使用します。アクセント付きの文字が表示されても「壊れない」ことを保証するための最良の方法だったため、HTMLエンティティをデータベースに格納していました。私は、今のところ賛否両論を上回っていると思う - 私は文字列の最初の100語だけを表示しようとするようなこの他の問題を抱えていた。すべてのあなたの助けを借りてくれてありがとう。 – NadeemH

関連する問題