Как стать автором
Поиск
Написать публикацию
Обновить

Сравнительный обзор Microsoft SQL Driver for PHP

Время на прочтение2 мин
Количество просмотров3.8K
Поиск по «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.
Все вышеперечисленные проблемы решаются использованием «SQL Server Driver for PHP». Однако мы обретаем новые проблемы:
  • Отсутствие (возможно временно) нескольких очень полезных функций-аналогов старого драйвера 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 таких проблем не было замечено.
Несмотря на такой достаточно большой список новых проблем, к драйверу от Microsoft имеет смысл присмотреться и изучить его работу в своих проектах под Windows Server и MS SQL. Проект стабильно развивается и проблемы устраняются.

Надеюсь, этот обзор кому-нибудь пригодится.

Спасибо за внимание!
Теги:
Хабы:
Всего голосов 36: ↑28 и ↓8+20
Комментарии27

Публикации

Ближайшие события