Caractère d'échappement MySQL et opérateur LIKE : pourquoi un double échappement pour ''
Considérez la requête MySQL suivante :
(SELECT * FROM `titles` WHERE title = 'test\') UNION ALL (SELECT * FROM `titles` WHERE title LIKE 'test\\')
Le résultat montre que les deux requêtes correspondent avec succès à la ligne avec le titre « test », même si une barre oblique inverse supplémentaire est ajoutée dans la clause LIKE ('test\'). Ce comportement soulève la question : pourquoi une barre oblique inverse supplémentaire () est-elle requise pour l'opérateur LIKE mais pas pour l'opérateur = (égal) ?
Echapper '' dans les littéraux de chaîne
MySQL utilise un caractère ('') comme caractère d'échappement dans les chaînes. Cela signifie que le caractère suivant a une signification particulière. Dans le « test » littéral, la barre oblique inverse échappe à la barre oblique inverse elle-même, ce qui donne « test » comme chaîne réelle. Ce comportement est cohérent avec la plupart des langages de programmation et des implémentations SQL.
Opérateur LIKE et caractères d'échappement
L'opérateur LIKE est conçu pour la correspondance de modèles dans les chaînes. Cependant, MySQL désigne spécifiquement une barre oblique inverse () comme caractère générique, qui correspond à n'importe quel caractère unique. Ce comportement introduit un conflit potentiel car une barre oblique inverse littérale () doit être échappée pour être traitée comme un caractère.
Pour résoudre ce conflit, MySQL applique un double échappement au caractère barre oblique inverse lorsqu'il est utilisé dans des modèles LIKE. Cela signifie que chaque barre oblique inverse du modèle doit être doublée pour être traitée comme une barre oblique inverse littérale. Par exemple, le modèle « test » correspond aux chaînes avec « test » tandis que « test » correspond aux chaînes avec « test ».
Modification du caractère d'échappement
Le caractère par défaut Le caractère d'échappement de l'opérateur LIKE peut être modifié à l'aide de la clause ESCAPE. Par exemple, la requête suivante utilise « | » comme caractère d'échappement, permettant à une seule barre oblique inverse d'être traitée comme un littéral :
SELECT * FROM `titles` WHERE title LIKE 'test\' ESCAPE '|'
Conclusion
Le double mécanisme d'échappement de MySQL pour le caractère barre oblique inverse dans les modèles LIKE est nécessaire pour éviter les conflits avec le comportement générique de la barre oblique inverse. Alors que l'échappement de chaîne normal applique un seul niveau d'échappement, l'opérateur LIKE nécessite un double échappement pour différencier les barres obliques inverses littérales et les modèles génériques. Comprendre ce comportement garantit une correspondance de modèle précise lors de l'utilisation de l'opérateur LIKE dans MySQL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!