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

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

This is Ashok's Pen.

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

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


person Ashok Gupta    schedule 20.05.2009    source источник
comment
Это может быть ошибочно забито в Как я могу предотвратить SQL-инъекцию в PHP? ...   -  person Peter Mortensen    schedule 15.07.2019


Ответы (16)


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

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

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

Or:

SELECT 'This is Ashok\'s Pen.'

Избежать этого =)

person Rob    schedule 20.05.2009
comment
Возможно, вы захотите обновить свое сообщение, включив в него mysql_real_escape_string () или addlashes () в качестве возможных решений ... как в одном из комментариев ниже, OP заявляет, что они просто читают из файла и вставляют. - person James B; 20.05.2009
comment
Методы mysql_ * не рекомендуются для использования в будущем, поскольку они устарели. - person hd1; 23.05.2013
comment
Это правильный ответ, хотя в наши дни лучшим вариантом является использование одного из - person Ryan; 24.02.2014

'- escape-символ. Итак, ваша строка должна быть:

Это ручка Ашока

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

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

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

а затем передать значение хранимой процедуре.

person SO User    schedule 20.05.2009
comment
Я не вставляю данные вручную, я извлекаю их из файла, и там будут ваклуэ: ручка Ашока. Как его вставить. создал процедуру для этого .. как сделать это правильно. - person Ashok Gupta; 20.05.2009
comment
Дополнительная информация FWIW: обратная косая черта - это escape-символ; '' (две одинарные кавычки) - это специальная альтернатива, позволяющая экранировать символ одинарной кавычки. - person ToolmakerSteve; 08.07.2020

См. Мой ответ на «Как экранировать символы в MySQL»

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

person Paul Dixon    schedule 20.05.2009
comment
Я не вставляю данные вручную, я извлекаю их из файла, и там будут значения: ручка Ашока. Как его вставить. создал процедуру для этого .. как исправить. - person Ashok Gupta; 20.05.2009
comment
Просто примечание, 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.. - person NewBee; 03.05.2018

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

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

    mysql_real_escape_string($var);
?>

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

person user3818708    schedule 12.07.2014
comment
Просто примечание, 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.. - person NewBee; 03.05.2018

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

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

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

"Ah," Nearly Headless Nick waved an elegant hand, "a matter of no importance. . . . It's not as though I really wanted to join. . . . Thought I'd apply, but apparently I 'don't fulfill requirements' -"

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

Вместо этого вы можете кодировать текст Base64, чтобы получить чистую строку:

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Некоторые примечания о кодировке Base64:

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

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

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

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

person Christopher Schultz    schedule 16.02.2017

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

This is Ashok's Pen.

Становится:

This is Ashok\'s Pen.
person simon622    schedule 20.05.2009

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

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

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

person Dheeraj singh    schedule 27.04.2017

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

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

если mysqli_real_escape_string () не работает.

person Devil    schedule 10.03.2017

В 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);
?>
person Marcel Verwey    schedule 06.11.2013

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

Добавляет косые черты вручную в PHP

person Sonu    schedule 27.11.2013

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

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

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

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

person Anthony    schedule 19.04.2018
comment
Просто примечание, 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.. - person NewBee; 03.05.2018
comment
Да, нужно добавить i now mysqli_real_escape_string php.net/manual/en /mysqli.real-escape-string.php - person Anthony; 27.08.2018
comment
Было бы лучше обновить свой ответ (например, комментарии могут исчезнуть в любой момент). - person Peter Mortensen; 15.07.2019

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

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

person user7276516    schedule 10.12.2016

Возможно, вы могли бы взглянуть на функцию _1 _ в руководстве по MySQL.

person Julian    schedule 04.12.2015

Так выглядят мои данные как ответ 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 к всем (каждому) вхождению символов 'и

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

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

person Ajay Kharat    schedule 21.06.2021