Como faço para escaping de caracteres especiais no MySQL?

Por exemplo:

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

Erro:

Você tem um erro na sua syntax SQL; verifique o manual que corresponde à sua versão do servidor MySQL para a syntax correta para usar perto de ‘hi “” “na linha 1

Como eu construo esta consulta?

As informações fornecidas nesta resposta podem levar a práticas de programação inseguras.

As informações fornecidas aqui dependem muito da configuração do MySQL, incluindo (mas não se limitando a) a versão do programa, o cliente de database e a codificação de caracteres usada.

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

 O MySQL reconhece as seguintes seqüências de escape.
 \ 0 Um caractere ASCII NUL (0x00).
 \ 'Um caractere de aspas simples (' '').
 \ "Um aspas duplas (" "”) caractere.
 \ b Um caractere de retrocesso.
 \ n Um caractere de nova linha (linefeed).
 Um caractere de retorno de carro.
 \ t Um caractere de tabulação.
 \ Z ASCII 26 (Controle-Z).  Veja nota seguindo a tabela.
 \\ Um caractere de barra invertida (“\”).
 \% Um personagem.  Veja nota seguindo a tabela.
 \_ Um personagem.  Veja nota seguindo a tabela.

Então você precisa

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

Embora, como Bill Karwin observa abaixo , usar aspas duplas para delimitadores de string não é SQL padrão, então é uma boa prática usar aspas simples. Isso simplifica as coisas:

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

Você deve usar aspas simples para delimitadores de cadeia. A aspa simples é o delimitador de cadeia SQL padrão e as aspas duplas são delimitadores de identificadores (para que você possa usar palavras ou caracteres especiais nos nomes de tabelas ou colunas).

No MySQL, aspas duplas funcionam (fora do padrão) como um delimitador de cadeia por padrão (a menos que você configure o modo SQL ANSI ). Se alguma vez você usar outra marca de database SQL, você se beneficiará ao adquirir o hábito de usar aspas de maneira padronizada.

Outro benefício útil do uso de aspas simples é que os caracteres com aspas duplas literais dentro de sua string não precisam ser escapados:

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

Eu desenvolvi meu próprio método de escape do MySQL em Java (se útil para qualquer um).

Veja o código da turma abaixo.

Aviso: errado se o modo SQL NO_BACKSLASH_ESCAPES estiver ativado.

 private static final HashMap 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 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(); } 

O MySQL tem a function de string QUOTE , e deve resolver este problema:

Você pode usar mysql_real_escape_string . mysql_real_escape_string() não escape % e _ , então você deve escaping dos curingas do MySQL ( % e _ ) separadamente.

Para strings como essa, para mim, a maneira mais confortável de fazer isso é dobrar o ‘ou’, como explicado no manual do MySQL:

Existem várias maneiras de include caracteres de aspas em uma 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 citadas com “‘” não precisam de tratamento especial.

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

Se você estiver usando uma variável ao pesquisar em uma string, mysql_real_escape_string() é bom para você. Apenas minha sugestão:

 $char = "and way's 'hihi'"; $myvar = mysql_real_escape_string($char); select * from tablename where fields like "%string $myvar %"; 

Para testar como inserir as aspas duplas no MYSQL usando o Terminal, você pode usar a seguinte maneira.

TableName (Name, DString) -> Esquema
inserir em valores TableName (“Name”, “My QQDoubleQuotedStringQQ”)

depois de inserir o valor, você pode atualizar o valor no db com aspas duplas ou aspas simples

tabela de atualização TableName replace (Dstring, “QQ”, “\” “)

já que mysql_real_escape_string () está obsoleto no PHP 5.5 e removido do PHP 7.0, eu recomendo para você que é equivalente em mysqli mysqli_real_escape_string () .

Sintaxe:

mysqli_real_escape_string (conexão, escapestring);

Exemplo:

 $con=mysqli_connect("localhost","my_user","my_password","my_db"); // Check connection if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } // escape variables for security $your_string = 'string "hi" '; $escaped_string = mysqli_real_escape_string($con, $your_string); $sql = 'select * from tablename where fields like "%'.$escaped_string. '%" '; $result = $conn->query($sql); //here you can iterate over result array for displaying result 

você também pode usar addslashes () que Retorna uma string com barras invertidas adicionadas antes de caracteres como aspas simples (‘), aspas duplas (“), barra invertida (), NUL (o byte NUL) que precisam ser escapadas, mas tem vulnerabilidades injeções sql ver a resposta desta questão Exemplos de Injeções SQL através de addslashes () , então é melhor usar a function mysqli_real_escape_string ().

Ou se você quiser escaping caracteres para expressões regulares, então você pode usar preg_quote (string $ str [, string $ delimiter = NULL]) , que coloca uma barra invertida na frente de cada caractere que faz parte da syntax da expressão regular. caracteres de expressão regular são:. \ + *? [^] $ () {} =! <> | : –

Mas tenha cuidado, o preg_quote () não irá escaping do single (‘) ou aspas duplas (“).