Проблема кодирования 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 символы (из некоторых европейских языков).

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

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

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

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

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

3 ответа

Сначала у вас есть кодировка БД. Тогда у вас есть кодировка, используемая клиентом 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 на что-то еще, если это невозможно, посмотрите на класс пользователей, который отбрасывает поля.

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

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

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

Из вашего описания звучит так, будто PHP рассматривает соединение только как ASCII.

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