2009-05-19 12 views
50

Na przykład:Jak mogę uniknąć znaków specjalnych w MySQL?

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

Błąd:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'hi" "' at line 1

Jak zbudować tej kwerendy?

Odpowiedz

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.

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

Więc trzeba

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

Chociaż jak Bill Karwin notes below, z użyciem cudzysłowów dla ograniczników ciąg nie jest standardem SQL, więc jest to dobra praktyka, aby używać apostrofów . To upraszcza:

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

Można użyć mysql_real_escape_string. mysql_real_escape_string() nie ucieka od % i _, więc powinieneś osobno pominąć symbole wieloznaczne MySQL (% i _).

24

Powinieneś używać pojedynczych cudzysłowów do ograniczników ciągów. Pojedynczy cytat jest standardowym ogranicznikiem łańcucha SQL, a podwójne cudzysłowy są ogranicznikami identyfikatorów (dzięki czemu można używać specjalnych słów lub znaków w nazwach tabel lub kolumn).

W MySQL podwójne cudzysłowy działają (nieregularnie) jako ogranicznik łańcuchów domyślnie (chyba że ustawiono tryb SQL ANSI). Jeśli kiedykolwiek użyjesz innej marki bazy danych SQL, będziesz czerpać korzyści z nawyku regularnego używania cytatów.

Kolejny przydatny zaletą korzystania apostrofy jest dosłownym cudzysłów w swoim ciąg nie muszą być uciekł:

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

zgadzam się z ideą apostrofu bo jeśli przełączy się , powiedzmy, PostgresSQL będzie uparcie odrzucał twoje zapytania i musisz używać pojedynczych cudzysłowów. To dobra praktyka. – kovacsbv

26

ja stworzyliśmy własną metodę ucieczki MySQL w Javie (jeśli jest to przydatne dla każdego).

Zobacz kod klasy poniżej.

Ostrzeżenie: nieprawidłowe, jeśli włączony jest tryb SQL SQL.

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

Używane wyszukiwanie zastępuje tabelę w procedurze mysql, w której muszę uciec z ogranicznika tabulacji, aby poprawnie wstawić go do bazy danych, np. "\ T". thx –

9

MySQL posiada funkcję ciąg QUOTE i powinno rozwiązać ten problem:

4

ciągów tak, dla mnie najbardziej wygodny sposób na to jest podwojenie "lub”, jak wyjaśniono w instrukcji 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.

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

0

Jeżeli ty. Używając zmiennej podczas wyszukiwania w ciągu znaków, mysql_real_escape_string() jest dobre dla Ciebie. Po prostu moja sugestia:

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

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

Ta funkcja jest amortyzowana w PHP 5.5 i usuwana z wersji 7.0 –

0

Aby przetestować sposób wstawiania podwójnych cudzysłowów w MYSQL za pomocą Terminala, możesz użyć następującego sposobu.

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


po włożeniu wartość można zaktualizować wartość w dB cudzysłowach lub apostrofach

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

Powiązane problemy