Проблема кодирования Php / ODBC

Я использую ODBC для подключения к SQL Server с PHP. В PHP я читаю данные строки (nvarchar) из SQL Server, а затем хочу вставить ее в базу данных mysql. Когда я пытаюсь вставить такое значение в таблицу базы данных mysql, я получаю эту ошибку mysql:

Incorrect string value: '\xB3\xB9ow...' for column 'name' at row 1 

Для строки со всеми символами ASCII все в порядке, проблема возникает, когда существуют символы, отличные от ASCII (с некоторых европейских языков).

Таким образом, в более общих терминах: есть строка Unicode в базе данных MS SQL Server, которая извлекается PHP через ODBC. Затем он помещается в запрос sql insert (как значение для столбца varchar utf-8), который выполняется для базы данных mysql.

Может ли кто-нибудь объяснить мне, что происходит в этой ситуации с точки зрения кодирования? На каком этапе могут произойти преобразования символов?

Я использую: PHP 5.2.5, MySQL5.0.45-community-nt, MS Sql Server 2005.

PHP должен работать на платформе Linux .

UPDATE: Ошибка не возникает, когда я вызываю utf8_encode ($ s) в этой строке и использую это значение в запросе на вставку mysql, но тогда вставленная строка не отображается правильно в базе данных mysql (так что кодировка utf8 работает только для принудительного применения правильная строка utf8, но она теряет правильные символы).

Сначала у вас есть кодировка БД. Затем вы используете кодировку, используемую клиентом ODBC.

Если кодировка вашего клиентского соединения ODBC не соответствует одному из БД, в некоторых случаях уровень ODBC будет автоматически транскодировать ваши данные.

Хитрость здесь заключается в принудительном кодировании соединения клиента ODBC.

Для настройки «всего UTF-8»:

 $conn=odbc_connect(DB_DSN,DB_USR,DB_PWD); odbc_exec($conn, "SET NAMES 'UTF8'"); odbc_exec($conn, "SET client_encoding='UTF-8'"); // processing here 

Это отлично работает с PostgreSQL + Php 5.x. Точный синтаксис и параметры зависят от поставщика БД.

Вы можете найти очень полезную и понятную дополнительную информацию для MySql здесь: http://dev.mysql.com/doc/refman/5.0/fr/charset-connection.html

надеюсь это поможет.

Может быть, вы можете использовать расширение PDO , если это будет иметь какое-то значение?

Здесь есть комментарий пользователя, который предлагает изменить типы данных в sql-сервере на somethig else, если это невозможно посмотреть на класс пользователей, который создает поля.

У меня нет опыта работы с ODBC через PHP, но с функциями mysql, по-видимому, по умолчанию по умолчанию для соединений ASCII и UTF8 необходимо сделать явным, если вы хотите избежать проблем.

Вы уверены, что PHP и сервер MySQL общаются в UTF8? До PHP 6 поддержка Unicode, как правило, вызывает раздражение.

Я помню, что в документах MySQL упоминается параметр строки подключения для настройки кодировки Unicode.

Из вашего описания это похоже на то, что PHP рассматривает соединение как ASCII-only.