Сравнительный обзор Microsoft SQL Driver for PHP
Поиск по «SQL Server Driver for PHP» не дал никаких результатов, и я решил написать эту статью.
Некоторые уже в курсе, что Microsoft выпустили свой драйвер для PHP с блекджеком использованием возможностей Native SQL Client и, даже, открыли исходный код.
Зачем он нужен?
Во-первых, стандартный драйвер MS SQL (php_mssql.dll), который поставляется в комплекте с PHP, обладает рядом недостатков. Главным является то, что в его основе лежит библиотека ntwdblib.dll, которая больше не поддерживается Microsoft, и, больше не входит в комплект с новыми версиями MS SQL Server. Последняя версия имеет следующие проблемы:
- Ограничение на максимальную длину поля в resultset в 255 символов;
- Ограничение на максимальную длину переменной при вызове хранимой процедуры в те же самые 255 символов;
- Проблема с пустыми строками при вызове хранимой процедуры;
Если вызывать хранимую процедуру, где параметром является пустая строка, то библиотека магическим образом превратит строку в NULL. - Проблема с типом varchar и nvarchar размерностью больше 255 символов;
Все что длиннее — попросту обрезается. Обходным путем является приведение типа поля к varchar(max). В этом случае все работает правильно. - Также ntwdblib.dll значительно уступает в скорости получения результатов Native SQL Client.
- Отсутствие (возможно временно) нескольких очень полезных функций-аналогов старого драйвера MSSQL;
Например получение числа измененных строк, и, до недавнего времени не было функции получения числа строк в resultset. - Проблемы с получением возвращенного результата из хранимой процедуры, когда возвращается несколько resultset, даже если они пусты;
Это, конечно, можно обойти, установив флаг NOCOUNT в ON вызовом SET NOCOUNT ON перед запросом, но это не самое красивое решение. - При возникновении блокировки (deadlock), у нового драйвера нет удобного механизма обхода такой ситуации;
Обходное решение — использовать PHP функцию sleep() или usleep() и, при возникновении блокировки и через пару секунд попробовать выполнить запрос снова. - При получении результатов новый драйвер преобразовывает данные от типа базы данных к его аналогу в PHP, хотя это с точки зрения типизации данных правильно;
Так, например, поле с типом datetime будет преобразовано к PHP типа DateTime, а бинарные и текстовые поля к PHP Stream, что не удобно, т.к. приходится дополнительно обрабатывать полученные результаты, чтобы получить конечный, интересующий нас результат. - Полное отсутствие поддержки под *nix системами
В то время как php_mssql может быть скомпилирован с использованием FreeTDS. - Пожалуй, самым серьезным недостатком является не всегда стабильная работа под <irony>IIS6</irony>, под IIS7 и Apache таких проблем не было замечено.
Надеюсь, этот обзор кому-нибудь пригодится.
Спасибо за внимание!