Неверное отображение полей типа raw

Al

Новичок
Неверное отображение полей типа raw

Добрый день.

Сервер под Oracle EL 5, установлены Oracle 10.2.0.4.0, Apache 2.2.8, PHP 5.2.6

Коннект чудесный, русские буквы показываются корректно.

Но есть у нас поля в таблице - тип у них raw(16) заполняются обычно с помощью функции sys_guid, так вот если их вывести в браузер (простейшим примером из доки к модулю oci8) - то получим из "38DCF27ECFFF42A8899259900391D195" - "8Ьт~ПяBЁ‰’Yђ‘С•", а это критично, ибо это первичные ключи БД.

Этот же запрос, выполененый на сервере из sqlplus с переменными окружения идентичными Апачу - возвращает все корректно, так что мне думается что преобразование идет в php.

Собственно вопрос - что можно/нужно сделать чтобы избавиться от этой ошибки?

Код создания тестовой таблички:
PHP:
create table raw_test (id raw(16))
/
insert into raw_test select sys_guid() from all_objects where rownum < 11
/
commit
/
Код скрипта для теста
PHP:
<?php
header("Content-Type: text/html; charset=windows-1251");
$conn = oci_pconnect('insh', 'insh', '9DEMODEV');
  if (!$conn) {
    $e = oci_error();
    print htmlentities($e['message']);
    exit;
  }
  $query = 'select * from raw_test';
  $stid = oci_parse($conn, $query);
  if (!$stid) {
    $e = oci_error($conn);
    print htmlentities($e['message']);
    exit;
  }
  $r = oci_execute($stid, OCI_DEFAULT);
  if (!$r) {
    $e = oci_error($stid);
    echo htmlentities($e['message']);
    exit;
  }
  print '<table border="1">';
  while ($row = oci_fetch_array($stid, OCI_RETURN_NULLS)) {
    print '<tr>';
       foreach ($row as $item) {
         print '<td>'.($item?$item:'&nbsp;').'</td>';
       }
       print '</tr>';
  }
  print '</table>';
  oci_close($conn);
?>
Спасибо.
 

Al

Новичок
О чудо :) Спасибо за подсказку.

Еще один моментик - посколько это очередная версия "универсальной системы", то я не всегда знаю в каком поле мне могут встретиться такие данные.

Нет общего решения?
 

tony2001

TeaM PHPClub
Вероятно, надо проверять на oci_field_type() == "RAW" и делать bin2hex(), если надо выводить данные из поля RAW не в оригинальном (бинарном) виде, а в HEX.
 

Al

Новичок
А oci_field_type() через отдельный запрос к словарю данных это делает, или после парсинга/выполнения будет знать тип поля?
 

tony2001

TeaM PHPClub
не знаю что такое словарь данных.
все параметры результата (и его полей) выясняются в процессе выполнения запроса, т.е. oci_field_type($result, $i) просто смотрит на statement->columns[$i]->type и возвращает строку с соответствующим именем типа поля.
 

Al

Новичок
Словарь данных - это я про Оракл (user_tab_columns и прочее).

Ключевое - что не надо доп. запроса к БД.

Спасибо за консультацию и за вывод из мозгового тупика :)
 
Сверху