web-dev-qa-db-ja.com

MySQLでスラッシュ(\)を検索する方法は?そして、なぜ(=)にはエスケープ(\)が必要ではなく、Likeには必要ですか?

このクエリを検討してください( DEMO IS HERE

(SELECT * FROM `titles` where title = 'test\\')
UNION ALL
(SELECT * FROM `titles` where title LIKE 'test\\\\')

出力:

| ID | TITLE |
--------------
|  1 | test\ |
|  1 | test\ |

質問:

(\)(=)ではなく( like)追加\\が必要ですか? MySQLが(test \)(test \\)その後、(test \\\\)を使用することはLIKEにとって論理的です。

テーブル情報:

CREATE TABLE IF NOT EXISTS `titles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Dumping data for table `titles`
--

INSERT INTO `titles` (`id`, `title`) VALUES
(1, 'test\\');
35
user1646111

\は、デフォルトでLIKEのエスケープ文字として機能します。

LIKEの-​​ manual から:

MySQLは文字列でCエスケープ構文(たとえば、改行文字を表す「\ n」)を使用するため、LIKE文字列で使用する「\」は2倍にする必要があります。たとえば、「\ n」を検索するには、「\\ n」と指定します。 「\」を検索するには、「\\\\」と指定します。これは、バックスラッシュが取り除かれるためですパーサーによって一度およびパターンマッチが行われるとき.

これを変更するには、次のように別のエスケープ文字を指定します。

SELECT * FROM `titles` where title LIKE 'test\\' ESCAPE '|'
78
Explosion Pills

実際、以前の回答はすべてどこかで破壊されています。爆発ピルによって重要なビットが再現されているKaroly Horvathが提供するリンクでわかるように、1つの円記号(\)を検索する正しい方法は、一度に4つの円記号(\\\\)を使用することです

ところで、上記の1つのバックスラッシュを一度に表示するには2つを一度に使用し、4つを表示するには8つを使用する必要がありました。

37
aercolino

LIKEは2つのワイルド文字、%および_

これらの文字を一致させるには、エスケープを使用できます:\%\_。これは、\、同様にエスケープする必要があります。

これはすべて manual で文書化されています。

6
Karoly Horvath

テキストフィールド内で\を見つけるには、\を2回エスケープする必要がありました。そうでなければ、最後の%が見つかりました。

SELECT * FROM `table` where `field` LIKE '%\\\%';
3
Memo