2009-05-19 70 views

Trả lời

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.

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

Vì vậy, bạn cần

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

Mặc dù như Bill Karwin notes below, sử dụng dấu ngoặc kép cho delimiters chuỗi không phải là SQL tiêu chuẩn, do đó, nó thực hành tốt để sử dụng dấu nháy đơn . Điều này đơn giản hóa mọi thứ:

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

Bạn có thể sử dụng mysql_real_escape_string. mysql_real_escape_string() không thoát được %_, vì vậy bạn nên thoát khỏi ký tự đại diện MySQL (%_) một cách riêng biệt.

24

Bạn nên sử dụng dấu nháy đơn cho các dấu phân tách chuỗi. Trích dẫn một lần là dấu phân tách chuỗi tiêu chuẩn SQL và dấu ngoặc kép là dấu phân cách định danh (vì vậy bạn có thể sử dụng các từ hoặc ký tự đặc biệt trong tên của bảng hoặc cột).

Trong MySQL, báo giá kép hoạt động (không chuẩn) làm dấu phân tách chuỗi theo mặc định (trừ khi bạn đặt ANSI chế độ SQL). Nếu bạn đã từng sử dụng một thương hiệu khác của cơ sở dữ liệu SQL, bạn sẽ được hưởng lợi từ việc tham gia vào thói quen sử dụng dấu ngoặc kép một cách tiêu chuẩn.

Một lợi ích tiện dụng của việc sử dụng dấu chú giải đơn là các ký tự ngoặc kép đen trong chuỗi của bạn không cần phải được thoát:

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

Tôi đồng tình với ý tưởng đơn quote bởi vì nếu bạn chuyển sang , PostgresSQL sẽ kiên quyết từ chối truy vấn của bạn và bạn phải sử dụng dấu nháy đơn. Đó là một thực hành tốt. – kovacsbv

26

tôi đã phát triển phương pháp thoát MySQL của riêng tôi trong Java (nếu có ích cho bất kỳ ai).

Xem mã lớp bên dưới.

Cảnh báo: sai nếu NO_BACKSLASH_ESCAPES Chế độ SQL được bật.

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

Sử dụng tìm kiếm của bạn thay thế bảng trong một thủ tục mysql nơi tôi cần phải thoát khỏi một dấu phân cách tab được chèn chính xác trong db như '\ t'. thx –

9

MySQL có chuỗi chức năng QUOTE, và nó sẽ giải quyết vấn đề này:

4

Đối với chuỗi như vậy, đối với tôi cách thoải mái nhất để làm điều đó là tăng gấp đôi 'hoặc", như được giải thích trong cuốn hướng dẫn 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.

Đó là từ http://dev.mysql.com/doc/refman/5.0/en/string-literals.html

0

Nếu bạn. đang sử dụng một biến khi tìm kiếm trong một chuỗi, mysql_real_escape_string() là tốt cho bạn. Chỉ cần đề xuất của tôi:

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

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

Chức năng này được khấu hao trong PHP 5.5 và bị xóa khỏi 7.0 –

0

Để thử cách chèn dấu ngoặc kép trong MYSQL bằng Terminal bạn có thể sử dụng theo cách sau.

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


sau khi chèn giá trị mà bạn có thể cập nhật các giá trị trong db với dấu ngoặc kép hoặc dấu nháy đơn

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

Các vấn đề liên quan