Проблема кодирования Php / ODBC - PullRequest
1 голос
/ 01 мая 2010

Я использую 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 ]

4 голосов
/ 05 сентября 2011

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

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

1 голос
/ 02 мая 2010

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

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

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

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

1 голос
/ 01 мая 2010

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

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

...