Хорошо, вот мои настройки.Я работаю над приложением 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 не передаст правильный символ.