web-dev-qa-db-fra.com

Comment rechercher une barre oblique (\) dans MySQL? et pourquoi l'échappement (\) n'est pas requis pour où (=) mais pour Like est requis?

Considérez cette QUESTION ( DEMO IS ICI )

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

Sortie:

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

QUESTION:

Pourquoi aucun extra (\) requis pour (=) mais pour ( comme) supplémentaire \\ est requis? Il est clair que MySQL a échappé au (test \) avec (test \\) puis utiliser (test \\\\) est logique pour LIKE.

Informations sur le tableau:

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

\ fonctionne comme un caractère d'échappement dans LIKE par défaut.

Depuis le manuel pour LIKE:

Étant donné que MySQL utilise la syntaxe d'échappement C dans les chaînes (par exemple, "\ n" pour représenter un caractère de nouvelle ligne), vous devez doubler tout "\" que vous utilisez dans les chaînes LIKE. Par exemple, pour rechercher "\ n", spécifiez-le comme "\\ n". Pour rechercher "\", spécifiez-le comme "\\\\"; c'est parce que les barres obliques inverses sont supprimées une fois par l'analyseur et à nouveau lorsque la correspondance de modèle est effectuée , laissant une seule barre oblique inverse à comparer.

Vous pouvez changer cela en spécifiant un autre caractère d'échappement, comme dans:

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

En fait, toutes les réponses précédentes ont été mutilées quelque part. Comme vous pouvez le voir dans le lien fourni par Karoly Horvath, dont le bit significatif est reproduit par Explosion Pills, la bonne façon de rechercher 1 barre oblique inverse (\) est d'utiliser 4 barres obliques inverses à la fois (\\\\).

Soit dit en passant, pour montrer au-dessus de cette barre oblique inverse, j'ai dû en utiliser deux à la fois et pour montrer ces quatre, j'ai dû en utiliser huit.

37
aercolino

LIKE accepte deux caractères génériques, % et _.

Pour pouvoir faire correspondre ces caractères, l'échappement peut être utilisé: \%, \_. Cela signifie également que si vous souhaitez faire correspondre \, il doit également être échappé.

Tout cela est documenté dans le manuel .

6
Karoly Horvath

Pour trouver un \ dans un champ de texte, j'ai dû échapper au \ deux fois, sinon le % à la fin a été trouvé:

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