Как избежать одиночных кавычек в MySQL - PullRequest
88 голосов
/ 20 мая 2009

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

This is Ashok's Pen.

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

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

Ответы [ 16 ]

104 голосов
/ 20 мая 2009

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

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

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

Или:

SELECT 'This is Ashok\'s Pen.'

Escape it =)

9 голосов
/ 20 мая 2009

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

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

8 голосов
/ 20 мая 2009

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

Edit:

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

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

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

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

7 голосов
/ 23 мая 2013

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

Это действительно старый вопрос, но есть другой способ сделать это, который может быть или не быть более безопасным, в зависимости от вашей точки зрения. Это требует 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 '));

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

6 голосов
/ 12 июля 2014

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

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

 mysql_real_escape_string($var);?>

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

5 голосов
/ 20 мая 2009

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

This is Ashok's Pen.

становится:

This is Ashok\'s Pen.
3 голосов
/ 27 апреля 2017

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

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

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

3 голосов
/ 10 марта 2017

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

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

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

2 голосов
/ 06 ноября 2013

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