Как я имею дело с кавычками 'в SQL [дубликат]

Как уже упоминалось в комментариях, ConvertTo-Json попытается сгладить структуру объекта за максимальный уровень вложенности или depth , путем преобразования любого объекта, который он находит вне этого глубина до строки.

Глубина по умолчанию - 2, но вы можете указать, что она должна идти глубже с параметром Depth:

PS C:\> @{root=@{level1=@{level2=@("level3-1","level3-2")}}}|ConvertTo-Json
{
    "root":  {
        "level1":  {
            "level2":  "level3-1 level3-2"
        }
    }
}
PS C:\> @{root=@{level1=@{level2=@("level3-1","level3-2")}}}|ConvertTo-Json -Depth 3
{
    "root":  {
        "level1":  {
            "level2":  [
                "level3-1",
                "level3-2"
            ]
        }
    }
}
11
задан Agustin Meriles 10 May 2013 в 18:26
поделиться

7 ответов

Символ ESC', таким образом, необходимо было бы заменить кавычку двумя кавычками.

Например,

SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'

становится

SELECT * FROM PEOPLE WHERE SURNAME='O''Keefe'

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

Ваша команда SQL была бы:

SELECT * FROM PEOPLE WHERE SURNAME=?

Затем при выполнении его Вы передаете в "O'Keefe" в качестве параметра.

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

Я должен также указать на это, в то время как Ваши правые дела в качестве примера ошибка, Вы открываете себя много других проблем, не выходя из строк соответственно. См. http://en.wikipedia.org/wiki/SQL_injection для хорошей начальной точки или следующего классического xkcd комика.

alt text

30
ответ дан 3 December 2019 в 02:21
поделиться

Решение Oracle 10

SELECT * FROM PEOPLE WHERE SURNAME=q'{O'Keefe}'
3
ответ дан 3 December 2019 в 02:21
поделиться

Параметризированные запросы являются Вашим другом, как предложил Matt.

Command = SELECT * FROM PEOPLE WHERE SURNAME=?

Они защитят Вас от головных болей, связанных с

  • Строки с кавычками
  • Запросы дат использования
  • Внедрение SQL
1
ответ дан 3 December 2019 в 02:21
поделиться

Я предполагаю, что хороший вопрос - то, какой язык Вы используете?
В PHP Вы сделали бы: ВЫБЕРИТЕ * ОТ ЛЮДЕЙ ГДЕ ФАМИЛИЯ ='mysql_escape_string (O'Keefe)'
Но так как Вы не указывали язык, я предложу, чтобы Вы изучили строковую функцию Escape mysql или иначе на Вашем языке.

0
ответ дан 3 December 2019 в 02:21
поделиться

Использование параметризованного SQL обладает другими преимуществами, это уменьшает ЦП наверху (а также другие ресурсы) в Oracle путем сокращения объема работы, которого Oracle требует для парсинга оператора. Если Вы не используете параметры (мы называем их, связывают переменные в Oracle), затем "выбор * от нечто, откуда панель ='cat'" и "выбор * нечто, где панель ='dog'" рассматриваются как отдельные операторы, где как "выбор * от нечто, где панель =:b1" является тем же оператором, означая вещи как синтаксис, законность объектов, на которые ссылаются и т.д...., не должна быть проверена снова. Существуют случайные проблемы, которые возникают, когда использование связывает переменные, который обычно проявляется в не получении самого эффективного плана выполнения SQL, но существуют обходные решения для этого, и эти проблемы действительно зависят от предикатов, которые Вы используете, индексируя и скос данных.

1
ответ дан 3 December 2019 в 02:21
поделиться

Найденный в под 30-ми на Google...

Oracle SQL FAQ

-2
ответ дан 3 December 2019 в 02:21
поделиться

Входная фильтрация обычно делается на уровне языка, а не слоях базы данных.
php и.NET оба имеют их соответствующие библиотеки для выхода sql операторы. Проверьте свой язык, см. доступный waht's.
Если Ваши данные trustable, то можно просто сделать строковую замену для добавления другого 'infront' для выхода из него. Обычно это достаточно, при отсутствии рисков, что вход является злонамеренным.

0
ответ дан 3 December 2019 в 02:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: