Несоответствия символов в SQL Server - PullRequest
2 голосов
/ 24 декабря 2008

Очень странная вещь случается со мной, когда я пытаюсь вставить нелатинские символы (например, иврит, арабский и т. Д., Используя N'string для вставки '), используя PHP. Это происходит со всеми расширениями, которые я пробовал: mssql, odbc и native driver.

При вставке через код PHP, только при выборе через PHP он работает нормально, и я могу прочитать, что я вставил. В анализаторе запросов строки выглядят как тарабарщина, а код C ++ также получает тарабарщину.

При вставке через анализатор запросов он хорошо выглядит в анализаторе и в коде C ++, но при выборе его с помощью PHP вместо строк появляются вопросительные знаки.

Ответы [ 3 ]

1 голос
/ 01 января 2009

Это может быть связано с одной из двух проблем: ваша база данных / таблица / столбец использует набор символов, в котором символы, которые вы пытаетесь вставить, неизвестны. В вашем случае, я бы рекомендовал использовать UTF-8 (если вы не используете в основном не латинские символы, тогда UTF-16 будет предпочтительным выбором). Если вы абсолютно уверены, что ваша база данных способна хранить эти символы, это также могут быть неверные настройки соединения (для соединения с базой данных можно использовать другой набор символов, чем тот, который используется базой данных).

Другая проблема заключается в том, что PHP не поддерживает Unicode. Так что, если символы, которые вы пытаетесь вставить, встроены в исходный файл PHP, или если вы применяете строковые функции к запросу до его выполнения, скорее всего, PHP уже исказил исходную строку. К счастью, PHP имеет различные функции, которые поддерживают символы Юникода, поэтому вы можете использовать их. Некоторые из них вы можете найти здесь:

http://php.net/manual/en/refs.international.php

1 голос
/ 01 августа 2009

Мы также опробовали все доступные методы и нашли два рабочих решения, обрабатывающих данные 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
1 голос
/ 24 декабря 2008

Вы неправильно управляете настройкой соединения. Установите его, отправив соответствующие запросы перед началом обработки данных или изменив его в файле конфигурации (я предполагаю, что используемая вами сортировка является формой UTF).

Я не уверен, переводит ли то же самое в MsSQL, но в MySQL запросы:

SET NAMES 'utf8';
SET CHARACTER SET 'utf8';

И есть соответствующие атрибуты конфигурации, которые постоянно его устанавливают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...