Мы также опробовали все доступные методы и нашли два рабочих решения, обрабатывающих данные Unicode в полях NVARCHAR. К сожалению, драйвер SQL Server для PHP по-прежнему содержит некоторые ошибки и его очень сложно использовать, так как вам приходится конвертировать поля типа NVARCHAR вручную из UTF-16LE. В Zend Framework 1.9.0 есть поддержка, но я еще не рассматривал ее.
В настоящее время лучшим способом доступа к SQL Server из PHP, по-видимому, является использование COM и OLEDB:
$conn = new COM('ADODB.Connection', null, 65001);
$conn->Open('Provider=SQLNCLI;Server=SERVER;Database=DB;Uid=USER;Pwd=PASS');
$rs = $conn->Execute('SELECT nvarcharfield FROM sometable');
while (!$rs->EOF) {
echo $rs->Fields('nvarcharfield')->value, "\n";
$rs->MoveNext();
}
$rs->Close();
«65001» указывает, что этот компонент должен работать в режиме UTF-8, что, вероятно, то, что вы хотите. Поэтому все входящие и исходящие данные будут в кодировке UTF-8.
Было бы замечательно, если бы подготовленные запросы не были настолько сложными для программирования с использованием COM, так что вы можете взглянуть на ADOdb для PHP. Код становится немного другим:
$conn = NewADOConnection('ado_mssql');
$conn->charPage = 65001;
$conn->Connect('Provider=SQLNCLI;Server=SERVER;Database=DB;Uid=USER;Pwd=PASS');
$conn->SetFetchMode('ADODB_FETCH_ASSOC');
$rs = $conn->Execute('SELECT nvarcharfield FROM sometable');
while (!$rs->EOF) {
echo $rs->fields['nvarcharfield'], "\n";
$rs->MoveNext();
}
$rs->Close();
Используя ADOdb, подготовленные запросы в ADOdb намного проще писать и понимать.
Если у вас есть новый собственный клиент SQL из SQL Server 2008, вы можете заменить поставщика «SQLNCLI» на «SQLNCLI10».
Как только я получу некоторую репутацию, я добавлю встроенные ссылки (для новых пользователей разрешена только одна гиперссылка).
http://devzone.zend.com/article/4906-Zend-Framework-1.9.0-Released
http://msdn.microsoft.com/de-de/library/system.data.oledb.oledbcommand.prepare.aspx
http://adodb.sourceforge.net/
http://phplens.com/lens/adodb/docs-adodb.htm#prepare