Найти тему

Чем PostgreSQL отличается от MySQL?

Оглавление

MySQL де-факто является стандартом в веб-разработке. Любой спец по PHP является спецом в MySQL.

Мне же в текущем проекте поставили условие: работаем с сервером PostgreSQL. В самом деле, оба этих сервера БД используют язык SQL. Но тонкости все же есть. Так что сейчас мне приходится привыкать к PostgreSQL. Здесь я изложу свои впечатления от PostgreSQL и расскажу о тех тонкостях, которые мне уже попались. Когда наберу ещё материала, опубликую ещё одну статью.

Логотип PostgreSQL. Источник: Wikimedia Commons.
Логотип PostgreSQL. Источник: Wikimedia Commons.

Установка сервера PostgreSQL на локальный компьютер ничем не отличается от установки MySQL. А вот с клиентом типа PHPMyAdmin посложнее. Обычно я использую HeidiSQL, но с PostgreSQL он глючит, поэтому пришлось поставить какой-то условно-бесплатный клиент.

Впечатления от PostgreSQL положительные. Достаточно быстрый сервер. Специально провел несколько тестов на скорость, работает быстрее, чем мускул. Для теста сконвертировал базу движка OpenCart, которая с трудом волокёт несколько тысяч товарных позиций - прирост скорости заметен.

Тонкости. Типы полей.

Первое, что бросается в глаза - нет коротких строковых типов данных. Либо TEXT, либо CHAR. Впрочем, особых проблем при современных огромных SSD на серверах это не создаёт. Разве что для проектов с огромным количеством текстовой информации, может быть и будут сложности, уж не знаю.

Также есть тонкость с первичными ключами. В MySQL первичный ключ имеет тип INTEGER, снабженный атрибутом AUTO_INCREMENT. В PostgreSQL такого атрибута нет, поэтому первичному ключу надо присвоить тип SERIAL, а при добавлении строки вообще не указывать его значение:

INSERT INTO my_table (name, date,...) VALUES ('$name', CURRENT_TIMESTAMP,...

Это вынуждает при добавлении данных перечислять поля после названия таблицы. Мне даже пришлось написать небольшую утилиту, которая генерирует INSERT и UPDATE запросы, чтобы меньше времени уходило на написание запросов.

Есть парочка вкусностей. В текущем проекте мне часто придется работать с IP и Mac-адресами, а в PostgreSQL есть специальные поля для данных такого типа (INET и Mac соответственно).

Тонкости. Написание запросов.

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

$query = "INSERT INTO \" my_table\"(...";

Для ограничения выборки в MySQL используется конструкция LIMIT:

SELECT * FROM ... LIMIT $start, $number

В PostgreSQL используется конструкция LIMIT ... OFFSET:

SELECT * FROM ... LIMIT $number OFFSET $start

Причем LIMIT и OFFSET могут идти в произвольном порядке. При этом необязательно указывать оба этих параметра.

Тонкости. Функции PHP для работы с PostgreSQL.

Практически все функции, которые есть в PHP для MySQL, имеют свои аналоги для PostgreSQL. Только префикс другой: pg_. Например, функция pg_query. Исключением является функция pg_connect(). Ей надо передавать строку с параметрами соединения и все.

Тонкости. LAST_INSERT_ID.

Для MySQL в PHP есть функция mysql_insert_id(), которая возвращает значение первичного ключа последней добавленной записи. Для PostgreSQL такой функции нет. Как же получить ID последней добавленной записи? Вот небольшой лайфхак:

$query = 'SELECT * FROM "my_table" ORDER BY "ID" DESC LIMIT 1';
$res = pg_query($query) or die('Ошибка запроса');
$row = pg_fetch_array($res);
$last_insert_id = $row["ID"];

Резюме.

Итак, переход с MySQL на PostgreSQL не представляет никаких проблем для достаточно опытного программиста. Впрочем, для обычных задач такой переход не имеет смысла, поскольку виртуальные хостинги не часто имеют в комплекте сервер PostgreSQL. А настраивать сервер на VDS или на физическом сервере - это лишняя возня. Это становится оправданным лишь для крупных проектов с особыми требованиями. С другой стороны, умение работать с ещё одной технологией никогда никому не вредило.

Если вы заметили в тексте ошибки или знаете ещё какие-нибудь тонкости PostgreSQL, пишите об этом в комментариях.

Спасибо, что дочитали мою статью до конца. Если она вам понравилась, поставьте, пожалуйста, лайк. Также я буду рад, если вы подпишетесь на мой канал. Всегда рад прочитать ваши комментарии, ответить на вопросы и учесть ваши пожелания и предложения. До новых встреч!