Ответы пользователя по тегу SQL
  • Почему LENGTH(GROUP_CONCAT(`text`)) считает не верно?

    @neol
    length возвращает количество байт в строке

    А вам нужна char_length, которая возвращает количество символов.
    Ответ написан
    Комментировать
  • Сам не понимаю, как я добился этой sql инъекции?

    @neol
    Поставил это случайно, окей я понимаю, что когда мы вводим кавычку, подразумевается что тело запроса окончено, дальше мы ставим комментарий (причем без пробела), все что после него не учитывается, потом снова кавычка, которая не учитывается вроде бы, потому что мы поставили знак комментария, однако если написать вот так '== или вот так ==' или вот так 'SELECT pass FROM users where id=9, то все это неверно, че за фигня и как это работает?

    Без пробела -- распознаётся как арифметическая операция, а не комментарий (это описано в документации).
    чтобы вычислить ваше выражение
    login ''--''
    вступает в дело неявное преобразование типов, которое преобразует '' в 0. Получается 0--0.
    Чтобы сравнить все значения login в таблице c этим 0 опять вступает в дело преобразование типов и каждое значение приводится к числу (соответственно если логин начинается не с цифры, большей 0, то он будет равен 0). Ну и в результате запрос возвращает все логины, начинающиеся не с цифры, большей 0.
    Ответ написан
    5 комментариев
  • Нужен ли индекс на множественных условиях WHERE IN()?

    @neol
    Будет. Ответ на подобные вопросы может дать EXPLAIN.
    Ответ написан
    Комментировать
  • Индексируются ли столбцы "отдельно", или это надо указывать явно?

    @neol
    Столбцы отдельно не индексируются, но запросы по условию с первым из указанных столбцов могут использовать составной индекс.

    Несколько примеров:

    SELECT `id` FROM `table` WHERE `col1` = 1;

    Будет использовать индекс

    SELECT `id` FROM `table` WHERE `col1` = 1 AND `col2` = 1;

    Тоже будет использовать индекс

    SELECT `id` FROM `table` WHERE `col2` = 1;

    Индекс не будет использован.

    SELECT `id` FROM `table` WHERE `col1` = 1 OR `col2` = 1;

    А в этом запросе индекс хоть и будет использован, но только для col1. Для col2 - полный просмотр таблицы.

    SELECT `id` FROM `table` WHERE `col1` = 1 ORDER BY `col2`;

    Индекс будет использован для WHERE, но не будет для ORDER BY.
    Ответ написан
    5 комментариев
  • Зачем prepared statements? Почему не экранирование?

    @neol
    Потому что экранирование можно забыть (а если что-то возможно, то это рано или поздно произойдёт).
    С prepared statements такой проблемы нет.

    PS Забудьте про mysql_real_escape_string, его больше нет. И вообще всех функций mysql_* больше нет.
    Ответ написан
    4 комментария
  • MySql какой тип данных выбрать для url ?

    @neol
    TEXT вообще надо использовать аккуратно, так как запросы с участием BLOB/TEXT, требующие временной таблицы, всегда приводят к созданию таблицы на диске(пруф), что скорости вашим запросам явно не прибавит.

    В данном случае varchar будет более чем достаточно.
    Ответ написан
    Комментировать