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


98

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

This is Ashok's Pen.

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

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


Ответы:


127

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

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

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

Или:

SELECT 'This is Ashok\'s Pen.'

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


9
Возможно, вы захотите обновить свое сообщение, включив в него mysql_real_escape_string () или addlashes () в качестве возможных решений ... как в одном из комментариев ниже, OP заявляет, что они просто читают из файла и вставляют.
— Джеймс Б.

3
Методы mysql_ * не рекомендуется использовать в будущем, поскольку они устарели .
— hd1

Это правильный ответ, хотя в наши дни лучший вариант заключается в использовании одного из
— Райана

это сработало для меня.
— Большое

10

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

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

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

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

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

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


Я не вставляю данные вручную, я извлекаю их из файла, и там будут ваклуэ: ручка Ашока. Как его вставить. создал процедуру для этого .. как сделать это правильно.
— Ашок Гупта

Второстепенная нить FWIW: обратная косая черта - это «escape-символ»; ''(две одинарные кавычки) - это специальная альтернатива, разрешенная для «экранирования» символа одиночной кавычки.
— ToolmakerSteve,

9

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

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


1
Я не вставляю данные вручную, я извлекаю их из файла, и там будут значения: ручка Ашока. Как его вставить. создал процедуру для этого .. как сделать это правильно.
— Ашок Гупта

Просто примечание 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..
— NewBee

7

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

7

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

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

    mysql_real_escape_string($var);
?>

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


1
Просто примечание 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..
— NewBee

6

Есть другой способ сделать это, который может быть или не быть более безопасным, в зависимости от вашей точки зрения. Это требует 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 столбцов для удобства чтения в Stack Overflow. Вы можете перенести его на любое количество столбцов (или не переносить его вообще), и он все равно будет работать.

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

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

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


5

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

This is Ashok's Pen.

Становится:

This is Ashok\'s Pen.

3

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

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

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


3

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

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

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


3

В 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);
?>



0

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

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

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

0

Используйте 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..
— NewBee

Ага, нужно добавить i now mysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
— Энтони

Было бы лучше обновить свой ответ (например, комментарии могут исчезнуть в любой момент).
— Питер Мортенсен

0

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.