PHP и Oracle, каково это ... после MySQL

21.09.2007

Общая мысля

Вопросов администрирования и управления базами данных я касаться не буду, ибо этим занимаются настоящие джедаи под названием DBA, которые легко перекусывают провод под напряжением 220 и умеют махать мечами как Люк Скайвокер. Я же, как программист, буду рассматривать чисто прикладные вопросы о том как не испугаться оракла после кодинга под MySQL.

Первый вопрос, который меня собствено заинтересовал – а в чем же отличия. А отличия надо сказать огромны. Оракл круче – вот собственно основная мысль второго абзаца. Все там сделано мощно, хорошо и здорово. Да и постарше он чем MySQL. Больше тут говорить не о чем.

Собственно, для человека из той самой СУБД переход на него ознаменуется некоторыми основными вехами, к которым придется себя приучивать:

  • NULL это не пустая строка
  • Автоинкремент
  • LIMIT-выборки
  • Работа с BLOB полями
  • Привязки переменных

Автоинкремент

Эээ. Как бы тут сказать – нет там автоинкремента в чистом виде, что бы бац и при создании таблицы написать:

ID BIGINT UNSIGNED NOT NULL AUOT_INCREMENT PRIMARY KEY

и не париться особенно. Но. Ребята из данной конторы жизнь усложнять умеют и реализуют все намного хитрее. Но в оракле можно создать автоинкремент, причем даже не одним способом. Я знаю два:

  • Триггеры – идеологически это самый правильный путь, когда после создания таблицы мы делаем последовательность вида 1, 2, 3 … и в триггере после INSERT’а пишем код, который берет из этой последовательности следующее значение и вставляет его в нужное поле ID. Триггер на самом деле очень простой, пример этой операции показан здесь. Забрать идентификатор можно просто прочитав текущее значение из последовательности.
  • Самый простой с точки зрения программиста путь – блокируем таблицу и делаем SELECT MAX ( id ) из таблицы и вставляем туда max + 1. Оракл получается даже ни при чем. Но тем не менее вариант.

NULL это не пустая строка

Вы можете подумать – ну и что, что не пустая строка. Мне-то что от этого. А дело вот в чем. Предположим вы сделали поиск по базе данных и предлагаете пользователю выборку по некому полю. Пользователь вводит значение и мы ищем:

SELECT * FROM table WHERE name='что_ввел_пользователь'

Вроде бы все хорошо. Человек вводит слово “Вася” и радуется результатам поиска по данному имени. Но, предположим человек ничего не вводит и мы (вспоминая MySQL) должны искать по тем записям, где имя не указано. Но, тут не MySQL.

Когда мы вносили записи с пустыми именами в таблицу, оракл сам (без нашего согласия) взял и превратил пустые строки в NULL. И теперь мы ищем соответствие имя равно пустая строка. Здесь пустая строка превратится в NULL, но этот NULL не будет равен тому, что записан в базе, ибо их вообще нельзя сравнивать, такие уж это объекты. И в результате мы найдем ровно ноль строк, а не строки с пустыми именами как бы нам хотелось.

Единственным выходом из данной ситуации является написание дополнительного кода, когда при вводе пустой строки сравнения мы составляем запрос не как name=’‘, а как name IS NULL. Полезная страничка на эту тему находится тут, это довольно частый вопрос начинающих ораклоидов.

А. И еще одну штуку вспомнил, у них Varchar назвывается Varchar2. По политическим соображениям, как я понял. Выпендриваются что ли, но нам это до звезды. Можно не обращать внимания, а просто циферку при создании таблиц дописывать.

А об остальных особенностях видимо расскажу в следующих выпусках. А пока что – вперед на изучение этой крутой СУБД.


Комментирование этой статьи закрыто

Комментарии [4]

  1. Сен 21, 04:33 , pro

    oracle это же мощь, да и для других нужд

    и кстати, не помню точно при какой ситуации, но в mysql сталкивался с тем, что нужно было писать не =’‘ а именно is null

  2. Сен 22, 17:22 , beliyadm

    После MS SQL было очень непривычно, что не надо писать IS NULL – обратный процесс :)

  3. Сен 28, 16:59 , hurgadan

    автоинкримент создавать используя одновременно тригеры и секвенции не следует. Необходимо следить за валидностью двух обеъктов сразу тогда – за тригером и секвенцией. И по быстродействию это не лучший вариант. Лучше создать секвенцию и при вставке запиши в таблицу писать так:
    insert into table_name (id, text) values(seq_table_name.next_value, ‘текст’)

    P.S.: varchar тоже существует, не сипользуется просто

  4. Сен 29, 16:53 , Dead Krolik

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

    Ну или дайте ссылку на соотвествующую идеологию, просто в каменте я так понимаю трудно мысль развернуть.

Комментирование этой статьи закрыто

Кто я


Возраст: 23
Профессия: заяц


Категории


Полезные ссылки


Стишок

Зайчик-зайчик, скок-поскок!
Н-нна тебе дробину в бок!
Не с капустой же мы будем
Жрать на Новый год пирог...

eu-shestakov.livejournal.com