13

ワイン名のデータベースにクエリを実行しようとしていますが、その多くにはアクセントが含まれています (ただし、統一された方法ではないため、同様のワインがアクセント付きまたはアクセントなしで入力される可能性があります)。

基本的なクエリは次のようになります。

SELECT * FROM `table` WHERE `wine_name` REGEXP '[[:<:]]Faugères[[:>:]]'

これは、タイトルに「Faugeres」が含まれるエントリを返しますが、「Faugeres」は返しません。

SELECT * FROM `table` WHERE `wine_name` REGEXP '[[:<:]]Faugeres[[:>:]]'

反対を行います。

私は次のようなことを考えていました:

SELECT * 
FROM `table` 
WHERE `wine_name` REGEXP '[[:<:]]Faug[eèêéë]r[eèêéë]s[[:>:]]'

トリックを行うかもしれませんが、これはアクセントのない結果のみを返します。

フィールドは utf8_unicode_ci として照合されます。これは、私が読んだものから、あるべき姿です。

助言がありますか?!

4

7 に答える 7

7

あなたは運が悪いです:

警告

REGEXPおよびRLIKE演算子はバイト単位で機能するため、マルチバイトセーフではなく、マルチバイト文字セットで予期しない結果が生じる可能性があります。さらに、これらの演算子はバイト値で文字を比較し、アクセント付き文字は、特定の照合で同等として扱われる場合でも、同等と比較されない場合があります。

[[:<:]]と正規表現演算子は、単語境界の[[:>:]]マーカーです。LIKE演算子で達成できる最も近いものは、次の行にあります。

SELECT *
FROM `table`
WHERE wine_name = 'Faugères'
   OR wine_name LIKE 'Faugères %'
   OR wine_name LIKE '% Faugères'

ご覧のとおり、単語の境界の概念をスペースに制限しているため、完全に同等ではありません。他の境界に句を追加すると、混乱します。

全文検索を使用することもできますが(同じではありませんが)、InnoDBテーブルで全文索引を定義することはできません(まだ)。

あなたは確かに運が悪いです:)


補遺:これはMySQL8.0から変更されました。

MySQLは、International Components for Unicode(ICU)を使用して正規表現サポートを実装します。これは、完全なUnicodeサポートを提供し、マルチバイトセーフです。(MySQL 8.0.4より前は、MySQLはHenry Spencerの正規表現の実装を使用していました。これはバイト単位で動作し、マルチバイトセーフではありません。

于 2013-01-03T10:47:37.560 に答える
4

REGEXP と RLIKE はバイト指向であるため、試してみましたか:

SELECT 'Faugères' REGEXP 'Faug(e|è|ê|é|ë)r(e|è|ê|é|ë)s';

これは、これらのいずれかが式に含まれている必要があることを示しています。プラス (+) は 1 つまたは複数を意味するため、使用していないことに注意してください。必要なのは 1 つだけなので、プラスは使用しないでください。

于 2014-11-14T18:26:30.840 に答える
1

utf8_general_ci は、並べ替え時にアクセントとアクセントなしの違いを確認しません。多分これは検索にも当てはまります。また、REGEXP を LIKE に変更します。REGEXP はバイナリ比較を行います。

于 2013-01-03T10:49:34.817 に答える
0

この問題を解決するために、binary キーワードや latin1 文字セットを使用するなど、さまざまなことを試しましたが、役に立ちませんでした。
最後に、これが MySql のバグであることを考慮して、é と è の文字を

次のように置き換えました。

SELECT * 
FROM `table` 
WHERE replace(replace(wine_name, 'é', 'e'), 'è', 'e') REGEXP '[[:<:]]Faugeres[[:>:]]'
于 2014-07-21T17:11:38.473 に答える
-1

わかりました、何か他のものを探しているときに、この質問に出くわしました。

これは true を返します。

SELECT 'Faugères' REGEXP 'Faug[eèêéë]+r[eèêéë]+s';

それが役に立てば幸い。

「+」を追加すると、1 つ以上の文字の出現を探すように正規表現に指示されます。

于 2013-08-16T03:48:03.330 に答える