Как избежать одинарных кавычек в MySQL
Как вставить значение в MySQL, которое состоит из одиночных или двойных кавычек. я.е
This is Ashok's Pen.
одиночная кавычка создаст проблемы. Могут быть и другие символы.
Как правильно вставить данные?
16 ответов
довольно просто:
SELECT 'This is Ashok''s Pen.';
поэтому внутри строки замените каждую одиночную кавычку двумя из них.
или:
SELECT 'This is Ashok\'s Pen.'
денешься =)
см. мой ответ на "Как избежать символов в MySQL"
любая библиотека, которую вы используете для разговора с MySQL, будет иметь встроенную функцию экранирования, например, в PHP вы можете использовать mysqli_real_escape_string или PDO:: цитата
' является escape-символом. Так что ваша строка должна быть: Это перо Ашока!--2-->
изменить:
Если вы используете некоторый интерфейсный код, вам нужно сделать замену строки перед отправкой данных в 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);
$new_value может храниться в базе данных.
FROM_BASE64
.
предположим, у вас есть это сообщение, которое вы хотели бы вставить:
- Ах, - Почти Безголовый Ник изящно взмахнул рукой, - это не имеет значения. . . . Не то, чтобы я действительно хотел присоединиться. . . . Думал подать заявление, но ... видимо я не выполнил требований -"
эта цитата имеет кучу одинарных и двойных кавычек и была бы настоящей болью для вставки в MySQL. Если вы вставляете это из программы, легко избежать кавычек и т. д. Но если вам нужно поместить это в сценарий SQL, вам придется редактировать текст (чтобы избежать кавычек), который может быть подвержен ошибкам или чувствителен к переносу слов и т. д.
вместо этого вы можете base64-кодировать текст, поэтому у вас есть " чистый" строка:
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
некоторые заметки о base64-кодировке:
- в base64-кодировке-это двоичное кодирование, поэтому вам лучше убедиться, что вы получаете свой набор символов правильно, когда вы делаете кодировку, потому что MySQL собирается декодировать строку с кодировкой base64 в байты, а затем интерпретировать их. Будьте уверены
base64
и MySQL согласны с тем, что кодировка символов (я рекомендую UTF-8). - я обернул строку до 50 столбцы для удобочитаемости на SO. Вы можете обернуть его на любое количество столбцов, которые вы хотите (или не заворачивать), а он все равно будет работать.
теперь, чтобы загрузить это в 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);
?>
для программного доступа, вы можете использовать заполнители автоматически избежать небезопасных символов для вас.
в Perl DBI, например, вы можете использовать:
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
возможно, вы могли бы взглянуть на цитату функции в руководстве 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-языках!