Як вставити значення в MySQL, які складаються з одиничних або подвійних лапок. тобто
This is Ashok's Pen.
Єдина цитата створить проблеми. Можуть бути й інші символи втечі.
Як правильно вставити дані?
Як вставити значення в MySQL, які складаються з одиничних або подвійних лапок. тобто
This is Ashok's Pen.
Єдина цитата створить проблеми. Можуть бути й інші символи втечі.
Як правильно вставити дані?
Відповіді:
Простіше кажучи:
SELECT 'This is Ashok''s Pen.';
Тому всередині рядка замініть кожну цитату на дві.
Або:
SELECT 'This is Ashok\'s Pen.'
Уникнути =)
'- характер втечі. Отже, ваш рядок повинен бути:
Це Перо Ашока
Якщо ви використовуєте якийсь фронтальний код, вам потрібно зробити заміну рядка, перш ніж надсилати дані в збережену процедуру.
Наприклад, в C # ви можете зробити
value = value.Replace("'", "''");
а потім передати значення збереженій процедурі.
''
(дві одиничні лапки) - спеціальна альтернатива, дозволена для "уникнення" символу з однією цитатою.
Дивіться мою відповідь на тему "Як уникнути символів у MySQL"
Яку би бібліотеку ви не використовували для розмови з MySQL, буде вбудована функція уникнення, наприклад, в PHP ви можете використовувати mysqli_real_escape_string або PDO :: цитата
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.
.
Якщо ви використовуєте підготовлені оператори, драйвер оброблятиме будь-які втечі. Наприклад (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();
Використовуйте цей код:
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
Це вирішить вашу проблему, оскільки база даних не може виявити спеціальні символи рядка.
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.
.
Є ще один спосіб зробити це, який може бути, а може бути і не безпечнішим, залежно від вашої точки зору. Він вимагає MySQL 5.6 або новішої версії через використання конкретної рядкової функції:FROM_BASE64
.
Скажімо, у вас є це повідомлення, яке ви хочете вставити:
"Ах," майже головий Нік махнув елегантною рукою, - справа не важлива ... Це не так, ніби я дуже хотів приєднатися ... Думав, я подав би заявку, але, мабуть, я не виконую вимог '- "
Ця цитата має купу одно- та подвійних лапок, і було б справжнім болем вставити в MySQL. Якщо ви вставляєте це з програми, легко уникнути цитат тощо. Але, якщо вам доведеться помістити це в сценарій SQL, вам доведеться відредагувати текст (щоб уникнути цитат), який може бути схильним до помилок або чутливий до перекладу слів тощо.
Замість цього ви можете Base64-кодувати текст, так що у вас є "чистий" рядок:
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
Деякі зауваження про кодування Base64:
base64
і MySQL погодиться, що таке кодування символів (рекомендую UTF-8).Тепер, щоб завантажити це в MySQL:
INSERT INTO my_table (text) VALUES (FROM_BASE64('
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));
Це буде вставлено без будь-яких скарг, і вам не доведеться вручну уникати жодного тексту всередині рядка.
Якщо ви хочете зберігати (') апостроф у базі даних, використовуйте цей код нижче
$new_value = str_replace("'","\'", $value);
$ new_value може зберігатись у базі даних.
У PHP використовуйте mysqli_real_escape_string .
Приклад з посібника з 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']);
Якщо ви використовуєте PHP, просто використовуйте функцію addlashes ().
Для програмного доступу ви можете використовувати заповнювачі, щоб автоматично уникати небезпечних символів для вас.
Наприклад, у Perl DBI ви можете використовувати:
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
Використовуйте або addlahes (), або 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.
.
Як я це роблю, використовуючи Delphi:
Постановка "втечі":
TheString=" bla bla bla 'em some more apo:S 'em and so on ";
Рішення:
StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);
Результат:
TheString=" bla bla bla \'em some more apo:S \'em and so on ";
Ця функція замінить усі Char (39) на "\" ", що дозволяє вставляти або оновлювати текстові поля в MySQL без проблем.
Подібні функції є у всіх мовах програмування!