2009-05-19 46 views

Respuesta

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.

Ver 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. 

Por lo que necesita

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

Aunque como Bill Karwin notes below, utilizando comillas dobles para los delimitadores de cadenas no es SQL estándar, por lo que es una buena práctica usar comillas simples . Esto simplifica las cosas:

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

Puede utilizar mysql_real_escape_string. mysql_real_escape_string() no escapa % y _, por lo que debe escapar de los comodines de MySQL (% y _) por separado.

24

Debe usar comillas simples para los delimitadores de cadenas. La comilla simple es el delimitador de cadena SQL estándar, y las comillas dobles son delimitadores de identificador (para que pueda usar palabras o caracteres especiales en los nombres de tablas o columnas).

En MySQL, las comillas dobles funcionan (de forma no estándar) como un delimitador de cadena de forma predeterminada (a menos que establezca ANSI modo SQL). Si alguna vez usa otra marca de base de datos SQL, se beneficiará al adquirir el hábito de usar presupuestos de manera estándar.

Otro beneficio práctico de utilizar comillas simples es que las comillas dobles literales dentro de la cadena no necesitan ser escapado:

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

estoy de acuerdo con la idea de un solo presupuesto, porque si se cambia a , por ejemplo, PostgresSQL rechazará tercamente tus consultas y debes usar comillas simples. Es una buena práctica. – kovacsbv

26

he desarrollado mi propio método de escape de MySQL en Java (si es útil para cualquiera).

Consulte el código de clase más abajo.

Advertencia: incorrecta si el modo SQL NO_BACKSLASH_ESCAPES está habilitado.

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

Usé su tabla de reemplazo de búsqueda en un procedimiento mysql donde necesito escapar de un delimitador de tabulación para insertarlo correctamente en el archivo db como '\ t'. thx –

9

MySQL tiene la función de cadena QUOTE, y debe resolver este problema:

4

Para las cadenas por el estilo, para mí la forma más cómoda de hacerlo es duplicar la "o", como se explica en el manual de 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.

es a partir de http://dev.mysql.com/doc/refman/5.0/en/string-literals.html

0

Si. está usando una variable cuando busca en una cadena, mysql_real_escape_string() es bueno para usted. Sólo mi sugerencia:

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

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

Esta función se deprecia en PHP 5.5 y se elimina de 7.0 –

0

Para la prueba de cómo insertar las comillas dobles en MySQL utilizando Terminal puede utilizar siguiente manera.

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


después de insertar el valor que puede actualizar el valor en el PP con comillas dobles o comillas simples

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

Cuestiones relacionadas