Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ODBC кодировка при импорте

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: получаю пустые записи вместо русских
Vdomah
Отправлено: 14 Января, 2014 - 12:59:49
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Здравствуйте, уважаемые!

Работаю с базой в Transbase (текдок), откуда надо вытянуть таблицу с русскими строками. Но все кириллические строки вытягиваются пустыми. Ладно бы кракозябры, а так вообще ничего.

Подключаюсь таким образом:
PHP:
скопировать код в буфер обмена
  1. function odbcConnect()
  2.     {
  3.         $constr = "Driver={" . $this->odbc_driver . "};Database=" . $this->odbc_db . "@" . $this->odbc_serv . "; CharacterSet = UTF-8";
  4.         $this->odbc_id = odbc_connect($constr, $this->odbc_login, $this->odbc_pass);
  5.         //odbc_exec($this->odbc_id, "SET NAMES 'UTF8'");
  6.         //odbc_exec($this->odbc_id, "SET client_encoding='UTF-8'");
  7.         odbc_autocommit($this->odbc_id, TRUE);
  8.         $this->odbc_id ? print 'odbc success!' : 'odbc fail!';
  9.     }

С такими параметрами:
PHP:
скопировать код в буфер обмена
  1.  
  2.     public $odbc_serv = "localhost";
  3.     public $odbc_login = "tecdoc";
  4.     public $odbc_pass = "tcd_error_0";
  5.     public $odbc_db = "TECDOC_CD_3_2013";
  6.     public $odbc_driver = "Transbase ODBC TECDOC CD 3_2013";
  7.     public $odbc_id = "";
  8.  

Т.е. строка подключения выглядит так:
PHP:
скопировать код в буфер обмена
  1. "Driver={Transbase ODBC TECDOC CD 3_2013};Database=TECDOC_CD_3_2013@localhost; CharacterSet = UTF-8"

CharacterSet = UTF-8 добавил уже во время поиска причины этой проблемы.
Также нагуглил варианты: SET NAMES 'UTF8' и SET client_encoding='UTF-8' (указаны в odbcConnect()), которые ничего не дали.
Кодировка строк в базе - ASCII

Случалась раньше подобная проблема с mysql, где также нужно было спарсить базу в ASCII, но тогда указание кодировки в строке подключения помогло: 'mysql:dbname=wh;host=localhost;charset=utf8';

Буду очень рад всякой помощи!

UPD: сразу появилась мысль - может строка теряется не при вытяжке из базы, а при вставке ее во вторую базу? Потому что консоль выдает все таки не пустые строки, а кракозябры перед вставкой.

(Отредактировано автором: 14 Января, 2014 - 13:09:55)

 
 Top
peters
Отправлено: 14 Января, 2014 - 13:37:35
Post Id


Гость


Покинул форум
Сообщений всего: 90
Дата рег-ции: Янв. 2014  


Помог: 7 раз(а)




А попробуй перед вставкой во вторую базу сделать iconv русским полям ?
 
 Top
Vdomah
Отправлено: 14 Января, 2014 - 14:34:16
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




peters пишет:
А попробуй перед вставкой во вторую базу сделать iconv русским полям ?

Попробовал - iconv отдает false как ни крути. В комментах к iconv на php.net прочитал вот так попробовать:
PHP:
скопировать код в буфер обмена
  1. $enc = mb_detect_encoding($row['TEX_TEXT']);
  2. $row['TEX_TEXT'] = mb_convert_encoding($row['TEX_TEXT'],'utf-8',$enc);
  3.  

Ура, теперь в мою базу вставляются не пустые поля, а кракозябры)) Хоть что-то.
(Добавление)
Опять же на php.net нашел такой сниппет:
PHP:
скопировать код в буфер обмена
  1.  
  2. mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn);
  3.  

Применил его к базе, в которую вставляю. Результат: теперь вместо кракозябров вопросы!

(Отредактировано автором: 14 Января, 2014 - 14:34:30)

 
 Top
Vdomah
Отправлено: 14 Января, 2014 - 16:56:49
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Продолжаем исследоавния:
Сниппет с установкой всех переменных на деле не особо влияет на результат. Главное, что влияет, - mb_convert_encoding. Если применить
PHP:
скопировать код в буфер обмена
  1. $row['TEX_TEXT'] = mb_convert_encoding($row['TEX_TEXT'],'utf-8',$enc);

т.е. указать исходную кодировку, то получаю кракозябры.
Если так:
PHP:
скопировать код в буфер обмена
  1. $row['TEX_TEXT'] = mb_convert_encoding($row['TEX_TEXT'],'utf-8');

т.е. не указывая исходной кодировки - тоже кракозябры.

И даже так:

т.е. перекодируя из исходной в нее же - опять кракозябры.

Если его не применить вообще, то получаю пустые строки в базе.
 
 Top
Vdomah
Отправлено: 14 Января, 2014 - 23:58:16
Post Id


Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Последовательность телодвижений обнаружена!

Во-первых, файлу .php даем кодировку ANSI.
Во-вторых, делаем следующую странную вещь с проблемной строкой $row['TEX_TEXT']:
PHP:
скопировать код в буфер обмена
  1. $enc = mb_detect_encoding($row['TEX_TEXT']);
  2. $row['TEX_TEXT'] = mb_convert_encoding($row['TEX_TEXT'],$enc,'windows-1251');

И все чудесно импортируется.

Получается, вытягиваем строку, про которую mb_detect_encoding говорит, что она в ASCII, то есть практически в utf-8. Просто так без обработки она имеет кракозябровый вид. Теперь, после попадания строки к нам в скрипт с кодировкой ANSI, она получает кодировку windows-1251. Далее нужно с помощью mb_convert_encoding перекодировать ее из windows-1251 обратно в ее оригинальную кодировку. И все.

Было бы интересно узнать почему именно этот вариант заработал, очень буду рад если кто-то объяснит.

(Отредактировано автором: 15 Января, 2014 - 00:00:52)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB