web-dev-qa-db-fra.com

Comment échapper à des guillemets simples dans MySQL

Comment insérer une valeur dans MySQL constituée de guillemets simples ou doubles. c'est à dire

This is Ashok's Pen.

La citation unique va créer des problèmes. Il pourrait y avoir d'autres personnages d'échappement. 

Comment insérez-vous les données correctement?

86
Ashok Gupta

En termes simples:

SELECT 'This is Ashok''s Pen.';

Donc, à l'intérieur de la chaîne, remplacez chaque citation par deux.

Ou:

SELECT 'This is Ashok\'s Pen.'

Escape it =)

102
Rob

Voir ma réponse à "Comment échapper des caractères dans MySQL"

Quelle que soit la bibliothèque que vous utilisez pour dialoguer avec MySQL, une fonction d'échappement est intégrée, par exemple. dans PHP, vous pouvez utiliser mysqli_real_escape_string ou PDO :: quote

9
Paul Dixon

'est le personnage d'échappement. Donc, votre chaîne devrait être: Ceci est le stylo d'Ashok

Modifier:

Si vous utilisez du code frontal, vous devez remplacer la chaîne avant d’envoyer les données au SP.

Pour par exemple. en C # vous pouvez faire 

value = value.Replace("'","''");

puis passez la valeur à SP.

8
Rashmi Pandit

Si vous utilisez des instructions préparées, le pilote gérera toutes les échappements. Par exemple (Java):

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();
7
hd1

C'est une question très ancienne, mais il existe une autre façon de le faire qui peut ou peut ne pas être plus sûre, selon votre point de vue. Il nécessite MySQL 5.6 ou une version ultérieure en raison de l'utilisation d'une fonction de chaîne spécifique: FROM_BASE64 .

Supposons que vous souhaitiez insérer le message suivant:

"Ah," Nick presque sans tête agita une main élégante, "une affaire sans importance ... Ce n'est pas comme si je voulais vraiment devenir membre ... Je pensais que je pourrais postuler, mais apparemment je ne le fais pas" t répondre aux exigences '- "

Cette citation contient des guillemets simples et doubles et serait très pénible à insérer dans MySQL. Si vous insérez cela depuis un programme, il est facile d'échapper aux guillemets, etc. Mais si vous devez l'inscrire dans un script SQL, vous devrez éditer le texte (pour échapper aux guillemets), ce qui pourrait être sujet à des erreurs ou sensible au Word-wrapping, etc.

Au lieu de cela, vous pouvez encoder le texte en base64, vous avez donc une chaîne "propre":

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Quelques notes sur le codage base64:

  1. base64-encoding est un binary encoding, vous devez donc vous assurer que votre jeu de caractères est correct lorsque vous effectuez l'encodage, car MySQL va décoder la chaîne encodée en base64 en octets, puis les interpréter. Assurez-vous que base64 et MySQL sont d’accord sur le codage des caractères (je recommande UTF-8).
  2. J'ai encapsulé la chaîne à 50 colonnes pour assurer la lisibilité sur SO. Vous pouvez l'envelopper à n'importe quel nombre de colonnes que vous voulez (ou ne pas envelopper du tout) et cela fonctionnera toujours.

Maintenant, pour charger ceci dans MySQL:

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

Cela insérera sans aucune plainte et vous n'avez pas à échapper manuellement du texte à l'intérieur de la chaîne.

6
Christopher Schultz

Vous devriez échapper aux caractères spéciaux en utilisant le caractère \.

This is Ashok's Pen.

Devient:

This is Ashok\'s Pen.
5
simon622

Utilisez ce code:

<?php $var = "This is Ashok's Pen.";

 mysql_real_escape_string($var);?>

Cela résoudra votre problème car la base de données ne peut pas détecter le caractère spécial de la chaîne. 

5
user3818708

Si vous voulez conserver (') apostrophe dans la base de données, utilisez le code ci-dessous

$new_value = str_replace("'","\'", $value); 

$ new_value peut stocker dans la base de données.

3
Dheeraj singh

Vous pouvez utiliser ce code

<?php
     $var = "This is Ashok's Pen.";
     addslashes($var);?>

si mysqli_real_escape_string ne fonctionne pas

3
Parkhya developer

En PHP, utilisez mysqli_real_escape_string ..

Exemple tiré du manuel PHP:

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", mysqli_sqlstate($link));
}

$city = mysqli_real_escape_string($link, $city);

/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", mysqli_affected_rows($link));
}

mysqli_close($link);
?>
2
Marcel Verwey

si vous utilisez php, utilisez simplement la fonction addlashes () 

PHP Manual addedlashes

1
Sonu
$var = mysqli_real_escape_string($conn, $_POST['varfield']);

Pour un accès programmatique, vous pouvez utiliser espaces réservés pour échapper automatiquement les caractères non sécurisés pour vous. 

Dans Perl DBI, par exemple, vous pouvez utiliser:

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 
0
Elle Fie

utilisez includeslahes (), .__ ou mysql_real_escape_string

0
Anthony

Peut-être pourriez-vous jeter un coup d’œil à la fonction Quote dans le manuel Mysql. 

http://dev.mysql.com/doc/refman/5.7/fr/string-functions.html#function_quote

0
Julian

La façon dont je le fais, en utilisant Delphi:

TheString pour "s'échapper":

TheString=" bla bla bla 'em some more apo:S 'em and so on ";

Solution:

StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);

Résultat:

TheString=" bla bla bla \'em some more apo:S \'em and so on ";

Cette fonction remplacera tous les caractères (39) par "\ '", ce qui vous permettra d’insérer ou de mettre à jour des champs de texte dans MySQL sans problème.

Des fonctions similaires se retrouvent dans toutes les langues prog!

0
user7276516