Проблема кодирования 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.