Как избежать специальных символов в MySQL?

Например:

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

Ошибка:

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

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

Ответ 1

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

Информация, предоставленная здесь, сильно зависит от конфигурации 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" %';

Ответ 2

Я разработал свой собственный метод escape-кода 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();
}

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

select * from tablename where fields like "%string $myvar  %";

Ответ 8

Чтобы проверить, как вставить двойные кавычки в MySQL с помощью терминала, вы можете использовать следующий способ:

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

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

update table TableName replace(Dstring, "QQ", "\"")