2016-08-24 1 views
0

У меня есть веб-приложение в стеке Ubuntu/PHP7/nginx, которое для целей передачи данных передает данные в базу данных SQL Server 2008. Я использую пакет PDO php7.0-sybase для подключения к MSSQL. Я использую подготовленный запрос оператора к хранимой процедуре для вставки данных. Поля на стороне SQL Server представляют собой поля nvarchar различной длины. Проблема: сформировать контент из веб-приложения со специальными символами (символы новой строки, буквы с акцентом и т. Д.), Показывается как все искаженные символы (китайские символы), вставленные в базу данных. Я подозреваю, что это проблема с кодировкой, но я не смог точно определить, что именно эта проблема, поскольку я не осведомлен в этой области.Как правильно передать содержимое формы со специальными символами в поле nvarchar SQL Server из приложения PHP/Linux?

Если я тестирую выполнение вставки непосредственно на SQL Server с использованием T-SQL, текст со специальными символами отображается правильно.

Если я сбрасываю кодировку текста, прежде чем отправить его из веб-приложения, он сообщает мне, что это ASCII, который должен быть совместим с UTF-8, правильно? Я также попытался явно преобразовать его в UTF-8 перед отправкой.

Есть ли что-то, что мне нужно установить в конфигурации моего драйвера db? Или, может быть, драйвер просто не знает, как правильно обрабатывать эти данные?

В качестве примечания мы экспериментировали с отправкой данных этого типа в поле varchar, и текст отображается правильно, так что это проблема с типом данных nvarchar.

ответ

1

На данный момент SQL Server не поддерживает UTF-8 для сохраненных данных. Тип данных nvarchar соответствует UTF-16.

+0

Ах. Показывает то, что я знаю. Я попытался сделать ручное преобразование одного из полей со специальными символами в кодировку UTF-16 (используя функцию 'iconv()' PHP), прежде чем отправлять данные и это работает. Но как обычно люди пишут PHP-приложение? Есть ли способ заставить PHP автоматически передавать поля таким образом или заставить SQL Server преобразовывать их в соответствующую кодировку? –

+0

Я сделал больше тестов, и кажется, что исходным источником проблемы является библиотека/драйвер db. Я протестировал свою работу над другой системой dev с php5 и пакетом php5-mssql (который, я думаю, просто устанавливает php5-sybase). Когда я использую эту библиотеку, текст со специальными символами передается правильно и неявно преобразуется в nvarchar при вставке через хранимую процедуру, как и следовало ожидать. Вероятно, я закончу явно кодирование каждого значения в UTF-16 перед отправкой, чтобы обеспечить прямую совместимость. –

+0

Как правило, можно было бы ожидать, что библиотеки db со временем станут лучше, а не хуже :) Если бы я был вами, я бы постарался перейти к последней версии и полностью забыть об этом (предполагая, что это не подведет в других случаях, конечно). –

Смежные вопросы