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