2010-05-01 4 views
1

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

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

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

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

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

Я использую: PHP 5.2.5, MySQL5.0.45-сообщества нт, MS Sql Server 2005.

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

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

+0

Вы ограничены odbc или можете установить/использовать, например. расширения sqlsrv? http://msdn.microsoft.com/en-us/library/cc296152%28SQL.90%29.aspx Он позволяет (легко) указать набор символов соединения. – VolkerK

+0

Это решение должно работать на Linux, и указанное расширение, к сожалению, не поддерживается на этой платформе. – JohnM2

+0

MySQL! = MSSQL. –

ответ

1

Возможно, вы можете использовать PDO extension, если это будет иметь значение?

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

1

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

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

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

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

4

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^