62

このクエリを検討してください(デモはここにあります)

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

出力:

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

質問:

(=)に追加の(\)が必要ないのに、(のように)追加の\\が必要なのはなぜですか?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\\');
4

5 に答える 5

122

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

マニュアルからLIKE

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

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

SELECT * FROM `titles` WHERE title LIKE 'test\\' ESCAPE '|'
于 2013-02-17T21:51:10.347 に答える
58

実際、以前のすべての回答はどこかで混乱しています。Karoly Horvathが提供するリンクでわかるように、その重要なビットはExplosion Pillsによって再現されています。1つのバックスラッシュ(\)を検索する正しい方法は、一度に4つのバックスラッシュ(\\\\)を使用することです。

ちなみに、その1つの円記号を上に表示するには、一度に2つを使用する必要があり、それらの4つを表示するには8つを使用する必要がありました。

于 2014-11-21T12:57:10.483 に答える
8

LIKE%2つのワイルド文字文字、およびを受け入れます_

これらの文字を一致させるために、エスケープを使用できます:\%\_。これは、一致させたい場合は\、それもエスケープする必要があることも意味します。

これはすべてマニュアルに記載されています。

于 2013-02-17T21:46:12.477 に答える
6

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

SELECT * FROM `table` where `field` LIKE '%\\\%';
于 2014-03-31T07:39:01.427 に答える
0

データベース列(Test \'s)から(\')を削除し、それをapostrophy(Test's)に置き換えたい場合は、次のクエリを使用できます。

SELECT replace(column_name, "\\'", "'") FROM table where column_name  LIKE "%\\\%";
于 2019-12-27T09:49:36.933 に答える