SELECT * FROM t WHERE c REGEXP '.*\(..\).*';
これはうまくいきませんでした。c
に3 文字以上の文字列を含む多くの行が返されました()
。
SELECT * FROM t WHERE c LIKE '%(__)%'
SQLフィドルはこちら
あなたの脱出はオフです。
http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp
MySQL は文字列で C エスケープ構文を使用するため (たとえば、"\n" で改行文字を表す)、REGEXP 文字列で使用するすべての "\" を二重にする必要があります。
使用する:
SELECT * FROM t WHERE c REGEXP '.*\\(..\\).*';
このクエリをどのように実行していますか? (たとえば)PHPスクリプトで使用していて、次のように書いている場合:
$sql = "SELECT ... REGEXP '.*\(..\).*';";
次に、PHPインタープリターは実際にこれらのバックスラッシュを取り除き、実際のクエリを生成します
... REGEXP '.*(..).*';
これは、少なくとも 2 文字の任意のレコードです。これが正しく機能するためには、ダブルエスケープする必要があります:
$sql = "SELECT ... REGEXP '.*\\(..\\).*';";
PHP は各セットからバックスラッシュの 1 つを取り除き、2 番目のバックスラッシュを実際に mysql に残します。