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

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

This is Ashok's Pen.

Единая цитата создаст проблемы. Там могут быть другие escape-символы.

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

20 ответов

Решение

Проще говоря:

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

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

Или же:

SELECT 'This is Ashok\'s Pen.'

Побег это =)

'это побег персонаж. Итак, ваша строка должна быть: это ручка Ашока

Редактировать:

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

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

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

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

Смотрите мой ответ на "Как экранировать символы в MySQL"

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

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

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

 mysql_real_escape_string($var);?>

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

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

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

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

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

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

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

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

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

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

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

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

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

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

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

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

Вы должны экранировать специальные символы, используя \ персонаж.

This is Ashok's Pen.

становится:

This is Ashok\'s Pen.

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

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

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

PHP Manual добавляет косые черты

Как пользователь Python, я заменяю кавычки необработанным «'»:

      don_not_work_str = "This is Ashok's Pen."
work_str = don_not_work_str.replace("'", r"\'")

Как я делаю, используя 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.

Подобные функции есть во всех прог-языках!

Используйте addlahes() или mysql_real_escape_string

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

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

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

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

Наконец, я просто использую этот код, данные в базе данных такие же, как и ввод.

      tmp = val.replace('\\', r'\\')
ret = tmp.replace('"', r'\"')

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

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

Так выглядят мои данные как ответ API, которые я хочу сохранить в базе данных MYSQL. Он содержит цитаты, HTML-код и т. Д.

Пример:-

      {

rewardName: "Cabela's eGiftCard $25.00",

shortDescription: '<p>adidas gift cards can be redeemed in over 150 adidas Sport Performance, adidas Originals, or adidas Outlet stores in the US, as well as online at&nbsp;<a href="http://adidas.com/">adidas.com</a>.</p>

terms: '<p>adidas Gift Cards may be redeemed for merchandise on&nbsp;<a href="http://adidas.com/">adidas.com</a>&nbsp;and in adidas Sport Performance, adidas Originals, and adidas Outlet stores in the United States.'

}

РЕШЕНИЕ

      CREATE TABLE `brand` (
`reward_name` varchar(2048),
`short_description` varchar(2048),
`terms` varchar(2048),  
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

При вставке In следует за JSON.stringify()

          let brandDetails= {
    rewardName: JSON.stringify(obj.rewardName),  
    shortDescription: JSON.stringify(obj.shortDescription),
    term: JSON.stringify(obj.term),
     }

Выше находится объект JSON, а ниже - SQL-запрос, который вставляет данные в MySQL.

      let query = `INSERT INTO brand (reward_name, short_description, terms) 
VALUES (${brandDetails.rewardName}, 
(${brandDetails.shortDescription}, ${brandDetails.terms})`;

Это сработало ....

Если ничего не работает, попробуйте следующее:

      var res = str.replace(/'/g, "\\'");
var res = res.replace(/"/g, "\\\"");

Он добавляет символ \ escape ко всем (каждому) появлению 'и "

Не уверен, что это правильный / профессиональный способ решить проблему

Я предполагаю, что это сработает, но в реальном контенте все одиночные и двойные кавычки будут заменены символом \

Если вы хотите вывести результат с одинарными и двойными кавычками ниже в MySQL:

      I'm saying "OK".

Затем вы можете написать это, как показано ниже:

      SELECT 'I\'m saying "OK".';
      SELECT 'I''m saying "OK".';
      SELECT "I'm saying \"OK\".";
      SELECT "I'm saying ""OK"".";

*В документе объясняется, как избежать одинарных и двойных кавычек.

Другие вопросы по тегам