Как избежать одиночных кавычек в MySQL


Как вставить значение в MySQL, которое состоит из одинарных или двойных кавычек. я.е

This is Ashok's Pen.

одинарная кавычка создаст проблемы. Могут быть и другие символы.

Как правильно вставить данные?

16 84

16 ответов:

довольно просто:

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

поэтому внутри строки замените каждую одинарную кавычку двумя из них.

или:

SELECT 'This is Ashok\'s Pen.'

Escape it =)

смотрите мой ответ "Как избежать символов в MySQL"

любая библиотека, которую вы используете для общения с MySQL, будет иметь встроенную функцию экранирования, например, в PHP вы можете использовать mysqli_real_escape_string или PDO:: quote

- это Escape-символ. Так что ваша строка должна быть: Это Ашок " S Pen

Edit:

Если вы используете какой-то внешний код, вам нужно сделать замену строки перед отправкой данных в SP.

например. в C# вы можете сделать

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

и затем передать значение SP.

Если вы используете подготовленные операторы, драйвер будет обрабатывать любой экранирование. Например (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();

вы должны избежать специальных символов, используя \ символ.

This is Ashok's Pen.

будет:

This is Ashok\'s Pen.

используйте этот код :

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

 mysql_real_escape_string($var);?>

Это решит вашу проблему, потому что база данных не может обнаружить специальный символ строки.

Если вы хотите сохранить ( ' ) Апостроф в базе данных используйте этот ниже код

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

$новое_значение можно хранить в базе данных.

это действительно старый вопрос, но есть другой способ сделать это, который может быть или не быть более безопасным, в зависимости от вашей точки зрения. Он требует MySQL 5.6 или позже из-за использования определенной функции строку: FROM_BASE64.

допустим, у вас есть это сообщение, которое вы хотели бы вставить:

- Ах, - Почти Безголовый Ник взмахнул изящной рукой, - это не имеет значения. . . . Это не так, как если бы я действительно хотел присоединиться. . . . Я думал, что подам заявление, но ... видимо я не выполнил требований -"

эта цитата имеет кучу одинарных и двойных кавычек и будет настоящей болью для вставки в MySQL. Если вы вставляете это из программы, легко избежать кавычек и т. д. Но, если вам нужно поместить это в сценарий SQL, вам придется отредактировать текст (чтобы избежать кавычек), который может быть подвержен ошибкам или чувствителен к переносу слов и т. д.

вместо этого, вы можете base64-кодировать текст, так что у вас есть " чистый" строка:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

некоторые заметки о base64-кодировке:

  1. base64-кодировка является двоичное кодирование, поэтому вам лучше убедиться, что вы получаете правильный набор символов при кодировании, потому что MySQL собирается декодировать строку с кодировкой base64 в байты, а затем интерпретировать их. Будьте уверены base64 и MySQL согласны с тем, что такое кодировка символов (я рекомендую UTF-8).
  2. я обернул строку до 50 колонки для удобочитаемости на так. Вы можете обернуть его на любое количество столбцов, которые вы хотите (или не заворачивать), а он все равно будет работать.

теперь, чтобы загрузить это в MySQL:

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

это будет вставлено без каких-либо жалоб, и вам не нужно было вручную-экранировать любой текст внутри строки.

вы можете использовать этот код

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

если mysqli_real_escape_string не работает

в 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']);

для программного доступа можно использовать заполнители автоматически избежать небезопасных символов для вас.

в Perl DBI, например, вы можете использовать:

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

Если вы используете php, просто используйте функцию addslashes ()

PHP Manual addslashes

возможно, вы могли бы взглянуть на цитату функции в руководстве Mysql.

http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_quote

как я делаю, используя Delphi:

TheString to "escape":

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 без каких-либо проблем.

подобные функции встречаются во всех prog-языках!

используйте либо addslahes(), или использования mysql_real_escape_string