2009-05-19 5 views

Répondre

78

The information provided in this answer can lead to insecure programming practices.

The information provided here depends highly on MySQL configuration, including (but not limited to) the program version, the database client and character-encoding used.

Voir http://dev.mysql.com/doc/refman/5.0/en/string-literals.html

 
MySQL recognizes the following escape sequences. 
\0  An ASCII NUL (0x00) character. 
\'  A single quote (“'”) character. 
\"  A double quote (“"”) character. 
\b  A backspace character. 
\n  A newline (linefeed) character. 
\r  A carriage return character. 
\t  A tab character. 
\Z  ASCII 26 (Control-Z). See note following the table. 
\\  A backslash (“\”) character. 
\%  A “%” character. See note following the table. 
\_  A “_” character. See note following the table. 

Alors vous avez besoin

select * from tablename where fields like "%string \"hi\" %"; 

Bien que Bill Karwin notes below, en utilisant des guillemets doubles pour délimiteurs de chaîne n'est pas standard SQL, il est donc conseillé d'utiliser des guillemets simples . Cela simplifie les choses:

select * from tablename where fields like '%string "hi" %'; 
9

Vous pouvez utiliser mysql_real_escape_string. mysql_real_escape_string() n'échappe pas % et _, donc vous devriez échapper MySQL caractères génériques (% et _) séparément.

24

Vous devez utiliser des guillemets simples pour les délimiteurs de chaîne. Le guillemet simple est le délimiteur de chaîne SQL standard et les guillemets doubles sont des délimiteurs d'identificateur (vous pouvez donc utiliser des mots ou des caractères spéciaux dans les noms de tables ou de colonnes).

Dans MySQL, les guillemets fonctionnent (non standard) comme délimiteur de chaîne par défaut (sauf si vous définissez le mode SQL ANSI). Si vous utilisez une autre marque de base de données SQL, vous aurez avantage à prendre l'habitude d'utiliser des guillemets de manière standard.

Un autre avantage pratique d'utiliser les guillemets simples est que les caractères à double citation littérale dans votre chaîne ne doivent pas nécessairement être échappé:

select * from tablename where fields like '%string "hi" %'; 
+0

Je suis d'accord avec l'idée simple citation, car si vous passez à Par exemple, PostgreSQL refuse obstinément vos requêtes et vous devez utiliser des guillemets simples. C'est une bonne pratique. – kovacsbv

26

J'ai développé ma propre méthode d'échappement MySQL en Java (si utile pour tout le monde).

Voir le code de classe ci-dessous.

Avertissement: faux si NO_BACKSLASH_ESCAPES Le mode SQL est activé.

private static final HashMap<String,String> sqlTokens; 
private static Pattern sqlTokenPattern; 

static 
{   
    //MySQL escape sequences: http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html 
    String[][] search_regex_replacement = new String[][] 
    { 
       //search string  search regex  sql replacement regex 
      { "\u0000" ,  "\\x00"  ,  "\\\\0"  }, 
      { "'"   ,  "'"   ,  "\\\\'"  }, 
      { "\""  ,  "\""  ,  "\\\\\"" }, 
      { "\b"  ,  "\\x08"  ,  "\\\\b"  }, 
      { "\n"  ,  "\\n"  ,  "\\\\n"  }, 
      { "\r"  ,  "\\r"  ,  "\\\\r"  }, 
      { "\t"  ,  "\\t"  ,  "\\\\t"  }, 
      { "\u001A" ,  "\\x1A"  ,  "\\\\Z"  }, 
      { "\\"  ,  "\\\\"  ,  "\\\\\\\\" } 
    }; 

    sqlTokens = new HashMap<String,String>(); 
    String patternStr = ""; 
    for (String[] srr : search_regex_replacement) 
    { 
     sqlTokens.put(srr[0], srr[2]); 
     patternStr += (patternStr.isEmpty() ? "" : "|") + srr[1];    
    } 
    sqlTokenPattern = Pattern.compile('(' + patternStr + ')'); 
} 


public static String escape(String s) 
{ 
    Matcher matcher = sqlTokenPattern.matcher(s); 
    StringBuffer sb = new StringBuffer(); 
    while(matcher.find()) 
    { 
     matcher.appendReplacement(sb, sqlTokens.get(matcher.group(1))); 
    } 
    matcher.appendTail(sb); 
    return sb.toString(); 
} 
+0

Utilisé votre table de remplacement de la recherche dans une procédure mysql où j'ai besoin d'échapper à un délimiteur de tabulation pour être correctement inséré dans la base de données comme '\ t'. thx –

9

MySQL a la fonction de chaîne QUOTE, et il devrait résoudre ce problème:

4

Pour les chaînes comme ça, pour moi la façon la plus confortable de le faire est de doubler le «ou », comme expliqué dans le manuel MySQL:

There are several ways to include quote characters within a string:

A “'” inside a string quoted with “'” may be written as “''”. 

A “"” inside a string quoted with “"” may be written as “""”. 

Precede the quote character by an escape character (“\”). 

A “'” inside a string quoted with “"” needs no special treatment and need not be doubled or escaped. In the same way, “"” inside a 

Strings quoted with “'” need no special treatment.

Il est de http://dev.mysql.com/doc/refman/5.0/en/string-literals.html

0

Si vous. utilisez une variable lors de la recherche dans une chaîne, mysql_real_escape_string() est bon pour vous. Juste ma suggestion:

$char = "and way's 'hihi'"; 
$myvar = mysql_real_escape_string($char); 

select * from tablename where fields like "%string $myvar %"; 
+0

Cette fonction est dépréciée en PHP 5.5 et supprimée de la version 7.0 –

0

Pour tester comment insérer les guillemets dans MYSQL en utilisant Terminal, vous pouvez utiliser la méthode suivante.

TableName(Name,DString) - > Schema
insert into TableName values("Name","My QQDoubleQuotedStringQQ")


après l'insertion de la valeur que vous pouvez mettre à jour la valeur dans la db avec des guillemets doubles ou simples

update table TableName replace(Dstring,"QQ","\"")

Questions connexes