Как мне избежать специальных символов в MySQL? - PullRequest
60 голосов
/ 19 мая 2009

Например:

select * from tablename where fields like "%string "hi"  %";

Ошибка:

У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с 'hi' '' в строке 1

Как мне построить этот запрос?

Ответы [ 8 ]

93 голосов
/ 19 мая 2009

Информация, представленная в этом ответе, может привести к небезопасным практикам программирования.

Информация, предоставленная здесь, сильно зависит от конфигурации MySQL, включая (но не ограничиваясь) версию программы, клиент базы данных и используемую кодировку символов.

См. http://dev.mysql.com/doc/refman/5.0/en/string-literals.html

MySQL recognizes the following escape sequences.
\0     An ASCII NUL (0x00) character.
\'     A single quote (“'”) character.
\"     A double quote (“"”) character.
\b     A backspace character.
\n     A newline (linefeed) character.
\r     A carriage return character.
\t     A tab character.
\Z     ASCII 26 (Control-Z). See note following the table.
\\     A backslash (“\”) character.
\%     A “%” character. See note following the table.
\_     A “_” character. See note following the table.

Так что вам нужно

select * from tablename where fields like "%string \"hi\" %";

Хотя, как Билл Карвин отмечает ниже , использование двойных кавычек для разделителей строк не является стандартным SQL, поэтому рекомендуется использовать одинарные кавычки. Это упрощает вещи:

select * from tablename where fields like '%string "hi" %';
27 голосов
/ 25 июня 2011

Я разработал свой собственный метод экранирования 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();
}
26 голосов
/ 19 мая 2009

Вы должны использовать одинарные кавычки для разделителей строк. Одиночная кавычка - это стандартный разделитель строк SQL, а двойные кавычки - это разделители идентификаторов (поэтому вы можете использовать специальные слова или символы в именах таблиц или столбцов).

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

Еще одно удобное преимущество использования одинарных кавычек заключается в том, что буквенные символы двойной кавычки в вашей строке не нужно экранировать:

select * from tablename where fields like '%string "hi" %';
11 голосов
/ 09 ноября 2013

MySQL имеет строковую функцию QUOTE , и он должен решить эту проблему:

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

Вы можете использовать mysql_real_escape_string . mysql_real_escape_string() не экранирует % и _, поэтому вы должны экранировать символы подстановки MySQL (% и _) отдельно.

6 голосов
/ 13 августа 2014

Для таких строк для меня наиболее удобный способ сделать это - удвоить 'или ", как объяснено в руководстве по 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.

0 голосов
/ 18 августа 2016

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

TableName (Имя, DString) -> Схема
вставить в значения TableName («Имя», «Мой QQDoubleQuotedStringQQ»)


после вставки значения вы можете обновить значение в БД с двойными или одинарными кавычками

обновить таблицу TableName replace (Dstring, "QQ", "\" ")

0 голосов
/ 23 декабря 2015

Если вы используете переменную при поиске в строке, mysql_real_escape_string() вам подходит. Просто мое предложение:

$char = "and way's 'hihi'";
$myvar = mysql_real_escape_string($char);

select * from tablename where fields like "%string $myvar  %";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...