Использование Freetds, PHP, SQL Server, ADODB и невозможность передавать данные, содержащие определенные специальные символы в UTF-8 - PullRequest
1 голос
/ 19 августа 2011

Хорошо, вот мои настройки.Я работаю над приложением PHP, которое находится на ОС Linux.Я пытаюсь передать данные в ОС Windows, в базу данных SQL Server.Я использую Freetds, чтобы выступать в качестве поставщика, поскольку, похоже, это то, что каждый использует для связи с SQL Server с компьютера с Linux.Я использую ADODB, которая является библиотекой абстракции базы данных для PHP.

Я также разрабатываю систему контроля, которая позволяет пользователю выбрать любую из сотен существующих стран, а также ввести штат или провинциюэта страна.Я беру все эти данные и должен передать их сторонней системе, которая является экземпляром SQL Server, о котором я говорил ранее.

Проблема в том, что пользователи вводят данные со специальными символами для своих штатов / стран, таких как ö.Мне потребовались часы, чтобы обнаружить, что это не PHP, мое приложение, мой код в качестве специальных символов правильно выводился во всех точках процесса, даже при отладке того, что передавалось параметру хранимой процедуры в методе adodb.Проблема была во FreeTDS, так как я обнаружил, что мне нужно добавить следующую строку в мой freetds.conf

client charset = UTF-8

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

Я не настолько разбираюсь в наборах символов, я читал Абсолютный Joels Минимум, что каждый разработчик должен знать о них

Пример государства в Румынии, которое неработа - Și la o răspântie cu statui, где, я думаю, проблема заключается в символе Ș.При выполнении запроса на сервере SQL он просто преобразует его в S. При выполнении в php и отправке через freetds он возвращает это сообщение об ошибке

The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 9 ("@in_state_name"): Data type 0xA7 has an invalid data length or metadata length.

Я пытался установить SET names UTF8 и несколько других перед выполнениемзапрос, но я снова думаю, что проблема заключается в том, что до того, как он попадет в запрос, freetds не передаст правильный символ.

1 Ответ

1 голос
/ 07 сентября 2011

Проблема в том, что текущая база данных принимает только varchar, а не nvarchar, поэтому мне нужно либо заставить стороннего разработчика поддерживать nvarchar, либо выполнить какой-либо тип сопоставления, чтобы получить ascii equivelent.

...