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?
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:
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 =)
'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ữ.
''
(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.
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
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.
,.
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();
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.
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.
,.
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:
base64
và MySQL đồng ý về mã hóa ký tự là gì (tôi khuyên bạn nên sử dụng UTF-8).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.
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.
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);
?>
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
Nếu bạn đang sử dụng PHP, chỉ cần sử dụng hàm addlash ().
Để 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));
Sử dụng addlahes () hoặc mysql_real_escape_string ().
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.
,.
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!