Comment échapper à l'apostrophe (') dans MySql?


147

La documentation MySQL dit que cela devrait être \'. Cependant, scite et mysql montrent que cela ''fonctionne. J'ai vu ça et ça marche. Que devrais-je faire?


Parlez-vous si oui ''ou non \'?
Raptor

\'est spécifique à MySQL alors qu'il ''est conforme à ANSI SQL si je ne me trompe pas
apokryfos

Selon l'implémentation de SQL; - '' \ '', '\' ', et parfois' [']' 'permettra une rupture du code. En plus de cela, n'importe quel nombre de remplacements Unicode contournera cette vérification. Le jeu entier ici abuse de la qualité de «l'évasion basée sur le fait qu'il exige que le décompte final soit pair plutôt que impair. Si cela s'avère étrange en écrasant plusieurs méthodes d'échappement les unes dans les autres, vous pouvez vaincre l'échappement et injecter du SQL brut. Morale de l'histoire: NE JAMAIS utiliser d'interpolation de chaîne, TOUJOURS utiliser des instructions préparées.
Shayne

Réponses:


186

La documentation MySQL que vous citez en dit un peu plus que ce que vous mentionnez. Il dit aussi,

Un « '» à l'intérieur d'une chaîne entre guillemets « '» peut être écrit « ''».

(De plus, vous avez lié à la version MySQL 5.0 du tableau 8.1. Séquences d'échappement de caractères spéciaux , et la version actuelle est 5.6 - mais le tableau 8.1 actuel . Séquences d'échappement de caractères spéciaux semble assez similaire.)

Je pense que la note Postgres sur le backslash_quote (string)paramètre est informative:

Cela contrôle si un guillemet peut être représenté par \'dans une chaîne littérale. La manière préférée, standard SQL, de représenter un guillemet est de le doubler ( '') mais PostgreSQL l'a également accepté \'. Cependant, l'utilisation de \'crée des risques de sécurité ...

Cela me dit qu'utiliser un caractère guillemet simple doublé est un meilleur choix global et à long terme que d'utiliser une barre oblique inverse pour échapper au guillemet simple.

Maintenant, si vous souhaitez également ajouter le choix de la langue, le choix de la base de données SQL et ses bizarreries non standard, et le choix du cadre de requête à l'équation, alors vous pourriez vous retrouver avec un choix différent. Vous ne donnez pas beaucoup d'informations sur vos contraintes.


42

Le SQL standard utilise des guillemets doublés; MySQL doit accepter cela pour être raisonnablement conforme.

'He said, "Don''t!"'

+1. Où est-il dit qu'il devrait être échappé par '' pas dev.mysql.com/doc/refman/5.0/en/…
user4951

Il dit «peut» plutôt que «devrait», mais les informations sont là (sous le tableau): Il existe plusieurs façons d'inclure des guillemets dans une chaîne: Un « '» à l'intérieur d'une chaîne entre guillemets « '» peut s'écrire « ''» . Un « "» à l'intérieur d'une chaîne entre guillemets « "» peut être écrit « ""». Faites précéder le caractère guillemet par un caractère d'échappement («` `»).
Jonathan Leffler

1
C'est la meilleure façon d'échapper à l'apostrophe en la doublant.
Alex _TNT

10

Je pense que user2087510 voulait dire:

name = 'something'
name = name.replace("'", "\\'")

J'ai également utilisé cela avec succès.


1
A travaillé pour moi alors que ces meilleures réponses n'ont pas fonctionné
Jared

1
pourquoi \\ 'plutôt que \'?
biniam

@biniam_Ethiopia le second \ échappe au premier
Juha Untinen

2
problème de sécurité possible. peut obtenir une injection SQL si la chaîne contient déjà \ ', vous insérez donc un \, qui se trouve maintenant dans la chaîne en tant que \\', ce qui terminera la chaîne. Utilisez plutôt name.replace ("'", "' '")
Garr Godfrey

6

écris juste ''à la place de 'je veux dire deux fois'


1
utiliser l'apostrophe deux fois au lieu d'une
MRRaja

5

Voici un exemple:

SELECT * FROM pubs WHERE name LIKE "%John's%"

Utilisez simplement des guillemets doubles pour entourer le guillemet simple.

Si vous insistez pour utiliser des guillemets simples (et la nécessité d'échapper au caractère):

SELECT * FROM pubs WHERE name LIKE '%John\'s%'

4

Il y a trois façons dont je suis conscient. Le premier n'étant pas le plus joli et le second étant le moyen courant dans la plupart des langages de programmation:

  1. Utilisez un autre guillemet simple: 'I mustn''t sin!'
  2. Utilisez le caractère d'échappement \avant le guillemet simple ':'I mustn\'t sin!'
  3. Utilisez des guillemets doubles pour entourer la chaîne au lieu de guillemets simples: "I mustn't sin!"

Ma préférence personnelle serait \'car elle est utilisée par tant de langages de programmation, mais ''est prise en charge par plus de dialectes SQL, donc l'utilisation de l'option 1 est meilleure pour la compatibilité. Sqlite, par exemple, ne fonctionne pas avec les échappements antislash.
okdewit

0

Remplacez la chaîne

value = value.replace(/'/g, "\\'");

où valeur est votre chaîne qui va stocker dans votre base de données.

Plus loin,

Package NPM pour cela, vous pouvez le regarder

https://www.npmjs.com/package/mysql-apostrophe


Veuillez ne pas simplement publier un outil ou une bibliothèque comme réponse. Démontrez au moins comment cela résout le problème dans la réponse elle-même.
Baum mit Augen

Cela ne fonctionnera pas. Vous avez oublié d'échapper aux choses. replace (/ \ '/ g, "\\\'")
Michael

0

Je pense que si vous avez un point de données avec une apostrophe, vous pouvez ajouter une apostrophe avant l'apostrophe

par exemple. 'C'est le logement de John'

Ici, MYSQL suppose deux phrases «C'est chez John»

Vous pouvez mettre «C'est chez John». Je pense que cela devrait fonctionner de cette façon.



0

Peut-être hors sujet, mais peut-être êtes-vous venu ici à la recherche d'un moyen de nettoyer l'entrée de texte à partir d'un formulaire HTML, de sorte que lorsqu'un utilisateur saisit le caractère apostrophe, il ne génère pas d'erreur lorsque vous essayez d'écrire le texte dans un SQL -table dans un DB. Il y a plusieurs façons de le faire, et vous voudrez peut-être aussi lire sur l'injection SQL, mais une option simple en PHP consiste à utiliser la fonction htmlspecialchars () qui convertira toutes vos apostrophes dans 'lesquelles est peut-être ce que vous voulez stocker en tous cas.


L'encodage n'est pas pour stocker, c'est pour afficher. Utilisez des déclarations préparées.
mickmackusa

Je reconnais que les déclarations préparées sont la référence en matière de sécurité et de fiabilité. Je mettais en évidence un cas spécifique dans lequel vous souhaitiez peut-être stocker des données texte au format HTML, auquel cas ma méthode est en plus d'utiliser des paramètres liés, plutôt que de remplacer. Entrée HTML, sortie HTML.
Grindlay
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.