Несоответствия символов PHP SQL Server

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

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

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

Я наконец понял это ... При использовании драйвера SQL Server для PHP версии 1.1 и PHP версии> = 5.3 вы можете добавить «CharacterSet» => «UTF-8» в строку подключения, передаваемую в sqlsrv_connect. Он будет правильно хранить нелатинские строки, если атрибут базы данных разработан как nvarchar или nchar !!!

Zamel 29.04.2010 19:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
5 612
3

Ответы 3

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

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

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

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

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

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

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

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

«... поскольку вам нужно вручную преобразовать поля типа NVARCHAR из UTF-16LE.». Предположим, я не хочу полностью менять свое решение на ado, как я могу вручную преобразовать NVARCHARS в UTF-8? Использование $ str = iconv ("ISO-8859-1", "UTF-8", $ str) хорошо работает на всех языках Latin-1. Проблема в том, что $ str = iconv ("ISO-8859-5", "UTF-8", $ str) вообще НЕ работает на русском языке.

Zamel 16.02.2010 15:16

Другие вопросы по теме