Cách thoát dấu ngoặc kép trong MySQL


98

Làm cách nào để chèn một giá trị trong MySQL bao gồm dấu nháy đơn hoặc dấu ngoặc kép. I E

This is Ashok's Pen.

Trích dẫn duy nhất sẽ tạo ra vấn đề. Có thể có các ký tự thoát khác.

Làm thế nào để bạn chèn dữ liệu đúng cách?


Câu trả lời:


126

Nói một cách khá đơn giản:

SELECT 'This is Ashok''s Pen.';

Vì vậy, bên trong chuỗi, hãy thay thế mỗi trích dẫn đơn lẻ bằng hai trong số chúng.

Hoặc là:

SELECT 'This is Ashok\'s Pen.'

Thoát nó ra =)


9
Bạn có thể muốn cập nhật bài đăng của mình để bao gồm mysql_real_escape_string () hoặc addlashes () là các giải pháp khả thi ... như trong một trong các nhận xét bên dưới, OP nói rằng họ chỉ đang đọc từ tệp và chèn.
James B

3
Phương thức mysql_ * không được khuyến khích sử dụng trong tương lai vì nó không được dùng nữa .
hd1

Đó là câu trả lời đúng, mặc dù những ngày này lựa chọn tốt nhất là sử dụng một trong những
Ryan

10

'là ký tự thoát. Vì vậy, chuỗi của bạn phải là:

Đây là Bút của Ashok

Nếu bạn đang sử dụng một số mã giao diện người dùng, bạn cần thực hiện thay thế chuỗi trước khi gửi dữ liệu đến quy trình đã lưu trữ.

Ví dụ, trong C #, bạn có thể làm

value = value.Replace("'", "''");

và sau đó chuyển giá trị cho thủ tục được lưu trữ.


Tôi không chèn dữ liệu theo cách thủ công, tôi trích xuất nó từ File, và sẽ có vaklues: Ashok's pen. Làm thế nào để chèn nó. creaetd một thủ tục để làm điều này .. làm thế nào để làm cho nó chính xác.
Ashok Gupta

FWIW nhỏ nit: dấu gạch chéo ngược là "ký tự thoát"; ''(hai dấu ngoặc kép) là một sự thay thế đặc biệt được phép "thoát" một ký tự trong dấu ngoặc kép.
ToolmakerSteve

9

Xem câu trả lời của tôi cho "Cách thoát ký tự trong MySQL"

Bất kỳ thư viện nào bạn đang sử dụng để nói chuyện với MySQL sẽ có một hàm thoát được tích hợp sẵn, ví dụ: trong PHP, bạn có thể sử dụng mysqli_real_escape_string hoặc PDO :: quote


1
Tôi không chèn dữ liệu theo cách thủ công, tôi trích xuất nó từ Tệp và sẽ có các giá trị: Bút của Ashok. Làm thế nào để chèn nó. đã tạo một thủ tục để thực hiện việc này .. làm thế nào để làm cho nó chính xác.
Ashok Gupta

Chỉ cần một lưu ý This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.,.
NewBee

7

Nếu bạn sử dụng các câu lệnh đã soạn sẵn, trình điều khiển sẽ xử lý mọi hành vi thoát. Ví dụ (Java):

Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
    prepped.setString(1, line);
    prepped.executeQuery();
}
conn.commit();
conn.close();

7

Sử dụng mã này:

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

Điều này sẽ giải quyết vấn đề của bạn, vì cơ sở dữ liệu không thể phát hiện các ký tự đặc biệt của một chuỗi.


1
Chỉ cần một lưu ý This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.,.
NewBee

6

Có một cách khác để làm điều này có thể an toàn hơn hoặc không, tùy thuộc vào quan điểm của bạn. Nó đòi hỏi MySQL 5.6 hoặc sau đó vì việc sử dụng của một hàm chuỗi cụ thể: FROM_BASE64.

Giả sử bạn có thông báo này muốn chèn:

"À," Nick gần như không đầu vẫy một cái tay thanh lịch, "một vấn đề không quan trọng.... Không phải là tôi thực sự muốn tham gia.... Tôi nghĩ tôi sẽ nộp đơn, nhưng có vẻ như tôi không đáp ứng yêu cầu '- "

Trích dẫn đó có một loạt các dấu ngoặc kép đơn và dấu ngoặc kép và sẽ là một khó khăn thực sự khi chèn vào MySQL. Nếu bạn đang chèn nó từ một chương trình, rất dễ dàng để thoát khỏi dấu ngoặc kép, v.v. Nhưng, nếu bạn phải đặt nó vào một tập lệnh SQL, bạn sẽ phải chỉnh sửa văn bản (để thoát khỏi dấu ngoặc kép), điều này có thể dễ xảy ra lỗi hoặc nhạy cảm với cách gói từ, v.v.

Thay vào đó, bạn có thể mã hóa văn bản theo kiểu Base64, để bạn có một chuỗi "sạch":

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Một số lưu ý về mã hóa Base64:

  1. Mã hóa Base64 là mã hóa nhị phân , vì vậy tốt hơn bạn nên đảm bảo rằng bạn đặt đúng bộ ký tự khi thực hiện mã hóa, vì MySQL sẽ giải mã chuỗi được mã hóa Base64 thành từng byte và sau đó diễn giải chúng. Hãy chắc chắn base64và MySQL đồng ý về mã hóa ký tự là gì (tôi khuyên bạn nên sử dụng UTF-8).
  2. Tôi đã bọc chuỗi thành 50 cột để dễ đọc trên Stack Overflow. Bạn có thể bọc nó thành bất kỳ số cột nào bạn muốn (hoặc không quấn gì cả) và nó sẽ vẫn hoạt động.

Bây giờ, để tải nó vào MySQL:

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

Điều này sẽ chèn mà không có bất kỳ khiếu nại nào và bạn không phải thoát theo cách thủ công bất kỳ văn bản nào bên trong chuỗi.


5

Bạn nên thoát khỏi các ký tự đặc biệt bằng cách sử dụng \ký tự.

This is Ashok's Pen.

Trở thành:

This is Ashok\'s Pen.

3

Nếu bạn muốn giữ (') dấu nháy đơn trong cơ sở dữ liệu, hãy sử dụng đoạn mã dưới đây

$new_value = str_replace("'","\'", $value); 

$ new_value có thể lưu trữ trong cơ sở dữ liệu.


3

Bạn có thể sử dụng mã này,

<?php
     $var = "This is Ashok's Pen.";
     addslashes($var);
?>

nếu mysqli_real_escape_string () không hoạt động.


3

Trong PHP, sử dụng mysqli_real_escape_string .

Ví dụ từ Hướng dẫn sử dụng PHP:

<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");

$city = "'s Hertogenbosch";

/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("Error: %s\n", mysqli_sqlstate($link));
}

$city = mysqli_real_escape_string($link, $city);

/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
    printf("%d Row inserted.\n", mysqli_affected_rows($link));
}

mysqli_close($link);
?>



0

Để truy cập có lập trình, bạn có thể sử dụng trình giữ chỗ để tự động thoát các ký tự không an toàn cho bạn.

Trong Perl DBI, chẳng hạn, bạn có thể sử dụng:

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 

0

Sử dụng addlahes () hoặc mysql_real_escape_string ().


Chỉ cần một lưu ý This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.,.
NewBee

Yup, cần phải thêm một tôi bây giờ mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony

Sẽ tốt hơn nếu bạn cập nhật câu trả lời của mình (ví dụ: bình luận có thể biến mất bất cứ lúc nào).
Peter Mortensen,

0

Theo cách tôi làm, bằng cách sử dụng Delphi:

TheString để "thoát":

TheString=" bla bla bla 'em some more apo:S 'em and so on ";

Giải pháp:

StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);

Kết quả:

TheString=" bla bla bla \'em some more apo:S \'em and so on ";

Hàm này sẽ thay thế tất cả Char (39) bằng "\ '" cho phép bạn chèn hoặc cập nhật các trường văn bản trong MySQL mà không gặp vấn đề gì.

Các chức năng tương tự được tìm thấy trong tất cả các ngôn ngữ lập trình!


0

Có thể bạn có thể xem qua hàm QUOTEtrong hướng dẫn sử dụng MySQL.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.