Печальная история о пустых строках в Oracle

«Программирование подобно подростковому сексу: одна ошибка — и ты поддерживаешь ее всю оставшуюся жизнь.» Не помню, где я встретил этот афоризм, но наблюдение весьма верное. По крайней мере, если речь идет о долгоживущих платформах; программы все же обычно живут меньше своих создателей.

Вот например, когда-то кто-то из создателей MS-DOS решил, что имена директорий в пути файла должны разделяться с не косой чертой (/), а обратной косой чертой (\). Между прочим, у этого человека были веские причины так поступить. Но нам всем пофик. Если бы все проклятия, которые произнесли в его адрес программисты, пишущие кроссплатформенный код, записать в одну книгу, то получится всеобъемлющая энциклопедия матерщины.

Плавно переходим к теме заметки. Вообще, с концепцией NULL в SQL все не очень хорошо в плане того, что различные СУБД несколько по-разному интерпретируют идею «отсутствие значения» в различных ситуациях. Но вот кто особо отличился на поприще изготовления граблей для невинных программистов из концепции NULL, так это Oracle. В Oracle пустые строки — это NULL.

Я не знаю, кто и зачем учинил это надругательство над здравым смыслом, и не могу придумать ему оправданий. И бог с ним, что очень часто нужно различать отсутствие значения и наличие четкого и однозначного пустого значения. Это недоразумение, скривившись, можно пережить. Проблема не в этом, а в том, что в результате строковые типы требуют трепетного и особого обращения с собой, о чем очень легко забыть. Строка в любой момент в результате операций с ней может стать пустой, т.е. NULL, а NULL требует специальной обработки: троичная логика, IS NULL и т.п. Этот факт безотказно генерирует массу поводов для седых — а иногда и вырванных — волос.

Вот вам пример по мотивам моей практики:

Это SQL возвращает 0 строк, что не удивляет. Пустая строка не содержит в себе 1234.

Эм… это почему опять 0 строк? А потому, что '' — это NULL, и '' LIKE 'все что угодно' возвращает не TRUE или FALSE, а NULL.

Вам этот пример кажется не таким уж и сложным для обнаружения? Хорошо, найдите ошибку в этом запросе:

Благодаря тому неизвестному мне гениальному товарищу, у которого в голове срослось пустое с несуществующим, в Oracle приходится не забывать писать вот так:

«Поубивал бы гадов» (c)

Upd. Если мне не удалось вас впечатлить масштабом разрушений, попробуйте еще вот такой запросик выполнить:

  2 comments for “Печальная история о пустых строках в Oracle

  1. Alex
    03.06.2015 at 16:24

    Возникает вопрос: а как себя будет вести БД, если строка задана как NOT NULL и в базу сохраняется пустая строка?
    Запретит ли он вставку или вставит пустую строку?

Добавить комментарий