Как мне избежать специальных символов в MySQL?
Например:
select * from tablename where fields like "%string "hi" %";
Ошибка:
У вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'hi" "' в строке 1
Как мне построить этот запрос?
8 ответов
Информация, представленная в этом ответе, может привести к небезопасным практикам программирования.
Информация, предоставленная здесь, сильно зависит от конфигурации MySQL, включая (но не ограничиваясь) версию программы, клиент базы данных и используемую кодировку символов.
См. http://dev.mysql.com/doc/refman/5.0/en/string-literals.html
MySQL распознает следующие escape-последовательности. \0 ASCII NUL (0x00) символ. \'Символ одинарной кавычки (""). \ "Двойная кавычка (" ""). \ b Символ возврата. \ n Символ новой строки (перевода строки). Символ возврата каретки. \ t Символ табуляции. \Z ASCII 26 (Control-Z). Смотрите примечание после таблицы. \\ Символ обратной косой черты ("\"). \% Характер. Смотрите примечание после таблицы. \_ Характер. Смотрите примечание после таблицы.
Так вам нужно
select * from tablename where fields like "%string \"hi\" %";
Хотя, как отмечает Билл Карвин ниже, использование двойных кавычек для разделителей строк не является стандартным SQL, поэтому рекомендуется использовать одинарные кавычки. Это упрощает вещи:
select * from tablename where fields like '%string "hi" %';
Я разработал свой собственный метод экранирования MySQL в Java (если он полезен для всех).
Смотрите код класса ниже.
Предупреждение: неверно, если NO_BACKSLASH_ESCAPES включен режим SQL.
private static final HashMap<String,String> sqlTokens;
private static Pattern sqlTokenPattern;
static
{
//MySQL escape sequences: http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html
String[][] search_regex_replacement = new String[][]
{
//search string search regex sql replacement regex
{ "\u0000" , "\\x00" , "\\\\0" },
{ "'" , "'" , "\\\\'" },
{ "\"" , "\"" , "\\\\\"" },
{ "\b" , "\\x08" , "\\\\b" },
{ "\n" , "\\n" , "\\\\n" },
{ "\r" , "\\r" , "\\\\r" },
{ "\t" , "\\t" , "\\\\t" },
{ "\u001A" , "\\x1A" , "\\\\Z" },
{ "\\" , "\\\\" , "\\\\\\\\" }
};
sqlTokens = new HashMap<String,String>();
String patternStr = "";
for (String[] srr : search_regex_replacement)
{
sqlTokens.put(srr[0], srr[2]);
patternStr += (patternStr.isEmpty() ? "" : "|") + srr[1];
}
sqlTokenPattern = Pattern.compile('(' + patternStr + ')');
}
public static String escape(String s)
{
Matcher matcher = sqlTokenPattern.matcher(s);
StringBuffer sb = new StringBuffer();
while(matcher.find())
{
matcher.appendReplacement(sb, sqlTokens.get(matcher.group(1)));
}
matcher.appendTail(sb);
return sb.toString();
}
Вы должны использовать одинарные кавычки для разделителей строк. Одиночная кавычка - это стандартный разделитель строк SQL, а двойные кавычки - это разделители идентификаторов (поэтому вы можете использовать специальные слова или символы в именах таблиц или столбцов).
В MySQL двойные кавычки работают (нестандартно) как разделитель строк по умолчанию (если вы не установили ANSI
Режим SQL). Если вы когда-либо будете использовать базу данных SQL другой марки, вы получите привычку использовать кавычки стандартно.
Еще одно удобное преимущество использования одинарных кавычек заключается в том, что буквенные двойные кавычки в вашей строке не нужно экранировать:
select * from tablename where fields like '%string "hi" %';
MySQL имеет строковую функцию QUOTE, и она должна решить эту проблему:
Для таких строк, для меня наиболее удобный способ сделать это - удвоить 'или ", как объяснено в руководстве по MySQL:
Есть несколько способов включить символы кавычки в строку:
A “'” inside a string quoted with “'” may be written as “''”. A “"” inside a string quoted with “"” may be written as “""”. Precede the quote character by an escape character (“\”). A “'” inside a string quoted with “"” needs no special treatment and need not be doubled or escaped. In the same way, “"” inside a
Строки, заключенные в "", не нуждаются в особой обработке.
Это от http://dev.mysql.com/doc/refman/5.0/en/string-literals.html.
Вы можете использовать http://in1.php.net/mysql_real_escape_string. mysql_real_escape_string()
не убегает %
а также _
, так что вы должны избегать подстановочных знаков MySQL (%
а также _
) по отдельности.
Для проверки того, как вставить двойные кавычки в MYSQL с помощью терминала, вы можете использовать следующий способ.
TableName (Имя,DString) - > Схема
вставить в значения TableName ("Имя", "Мой QQDoubleQuotedStringQQ")
после вставки значения вы можете обновить значение в БД с двойными или одинарными кавычками
обновить таблицу TableName replace(Dstring,"QQ","\"")
Если вы используете переменную при поиске в строке, mysql_real_escape_string()
это хорошо для тебя. Просто мое предложение:
$char = "and way's 'hihi'";
$myvar = mysql_real_escape_string($char);
select * from tablename where fields like "%string $myvar %";
Поскольку mysql_real_escape_string () устарела в PHP 5.5 и удалена из PHP 7.0, я рекомендую вам, чтобы она была эквивалентна в mysqli mysqli_real_escape_string ().
Синтаксис:
mysqli_real_escape_string (соединение, escapestring);
Пример:
$con=mysqli_connect("localhost","my_user","my_password","my_db");
// Check connection
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
// escape variables for security
$your_string = 'string "hi" ';
$escaped_string = mysqli_real_escape_string($con, $your_string);
$sql = 'select * from tablename where fields like "%'.$escaped_string. '%" ';
$result = $conn->query($sql);
//here you can iterate over result array for displaying result
Вы также можете использовать addlashes (), который возвращает строку с обратным слешем, добавленным перед символами, такими как одинарная кавычка ('), двойная кавычка ("), обратная косая черта (), NUL (байт NUL), которые необходимо экранировать, но у него есть уязвимости SQL-инъекции см. в ответе на этот вопрос. Примеры SQL-инъекций с помощью addlashes (), поэтому лучше использовать функцию mysqli_real_escape_string ().
Или, если вы хотите экранировать символы для регулярных выражений, вы можете использовать preg_quote (string $ str [, string $ delimiter = NULL]), который ставит обратную косую черту перед каждым символом, который является частью синтаксиса регулярного выражения. символы регулярного выражения: \ + *? [ ^ ] $ () { } =! < > |: -
Но будьте осторожны, preg_quote () не избежит одинарной (') или двойной кавычки (").