22.11.2014

Мускул и Йожег

Ну вот, по роду своей деятельности пришлось столкнуться вот с этими зверьками. Надо сказать, что они мне понравились.
MySQL существенно улучшился за последние несколько лет. Позволяет, по сравнению с Interbase, делать очень интересные запросы. И работает ничего так себе, быстро достаточно. Ну, конечно, есть пара нюансов, которые удивляют. Так вот, я о них :)

Первое, это конкатенация слов. Вроде бы есть стандарт SQL, но по умолчанию используется другой механизм. А отказ от стандарта -  ради "насильников". :) Поэтому приходится использовать функцию для соединения строк, вместо оператора. Хотя оператор, предлагаемый стандартом SQL, тоже несколько странный.

Вторая особенность - это логические операции. Сразу видно, что в Мускул они пришла из мира "насильников". Возможно, даже "гнусных". :)
Идея в том, что значение любого типа может трактоваться как логическое, а логическое, на самом деле, это целое. 0 означает "ложь", а все остальное - "истину". Стандартно логические условия в качестве истины возвращают единицу.
В результате можно мутить вот такие вот выражения:

salary*tax*(salary>1000).

Здесь мы рассчитываем налог на зарплату, при условии, что она больше 1000. Если меньше 1000, то налог равен нулю. В соответствии с требованиями стандарта такое выражение пришлось бы писать по-другому. Например, так:

case when salary > 1000 then salary*tax else 0 end

Конечно, первый подход гораздо эффективней и компактней. Но! Как легко же сделать ошибку. В частности, я наткнулся один раз. Начал писать условия в разделе where, отвлекся на что-то и получилось что-то вроде

where stype=1 and mode

После mode подразумевалось дописать условие. Но так как я отвлекся, то, вернувшись к задаче, дописать забыл. И в Мускуле это не ошибка, а вполне легальная запись логического выражения, так как любое значение может трактоваться как логическое. Так что будьте осторожны. Правильное условия выглядело примерно так:

where stype=1 and mode=4

Йожег тоже поразил. Включенной по умолчанию настройкой, которая перед сохранением редактируемого строкового поля в "гриде" пытается его сначала выполнить. Типа, а вдруг там какое-то SQL выражение. И если там вдруг правда оказалось SQL-выражение, то в поле будет записан результат его вычисления.
Это сделано для того, что бы пользователь мог что-то выполнить. Честное слово, руки бы отрывал. :)
Но есть нюасн: вычисляются многие выражения, но не CASE. Не понятно, что за прикол, то ли ошибка, то ли фича такая.
В общем, тоже словил косяк на пустом месте. Потому как не ожидал такой гадости от порядочной программы. Хотя меня предупреждали о такой вот занимательной особенности Йожега.

2 комментария:

  1. Я вот тоже столкнулся по работе с mysql. Тоже впечатления положительные. Шустро, удобно, дружелюбно. Но в дебри не углгублялся. У меня простенькая база. А вот что такое йожег я, честно говоря, не знаю. И гугление не помогло. Просветите :)

    ОтветитьУдалить
    Ответы
    1. Да это собственно средство для работы с серверами MySql. Это я его так ласково назвал :), вообще-то называется SQLyog.

      Удалить