Pull to refresh

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

Reading time 2 min
Views 3.6K
Поиск по «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. Проект стабильно развивается и проблемы устраняются.

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

Спасибо за внимание!
Tags:
Hubs:
+20
Comments 27
Comments Comments 27

Articles