Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
LowCoder
Member

Откуда:
Сообщений: 150
никак не удается получить массив из курсора и вывести в php из БД Oracle 11.2g XE если в поле данных русские символы. Что делать?

Подробнее: Есть БД в котоый поддерживается уникоад. Все Стандартно

select * from nls_database_parameters
 where parameter like '%CHARACTERSET'


NLS_CHARACTERSET	AL32UTF8
NLS_NCHAR_CHARACTERSET	AL16UTF16



в бд таблица в ней есть поле типа VARCHAR2 . Для пущей уникодности когда заполнял страницу данными то строкам делал

 convert('field to be inserted', 'UTF8'). 


Далее мне нужно в php получить через OCI вызвать хранимку которая по данной таблице формирует курсор и возвращает его. В php я получаю массив. Хорошо. Но этот массив мне нужен в UTF8 (для аякса) а он возвращается не таковым. те если я этот массив вывожу просто в браузер и устанавливаю кодировку UTF8 то у меня русские символы отображаются квадратиками. Ну и понятно в ответ на аякс запрос возвращается полная ахинея.

Как полечить?

Сейчас я вынужден идти на двух костылях - либо на стороне php проходить по всему массиву и функцией iconv конвертировать в utf8 что приводит к большим накладным расходом и некрасиво в принципе (но хотя бы все таки работает) либо на стороне БД открывать курсор проходить циклом по всей таблице и формировать на выходе из хранимки строку которая есть суть JSON массив столь любимый аяксом, ибо если я к полученному курсору применяю json_encode то вместо русских символов получаю null. Я даже никак не могу понять где ошибка- в ДНК, БД, или в драйвере OСI или как то php работает не совсем корректно или оптимально

Для ясности - текст хранимки

CREATE OR REPLACE PROCEDURE GETNAMELIST( list OUT sys_refcursor )
AS
BEGIN
 OPEN list FOR
 SELECT id_thing, name_thing 
 FROM thing
    ORDER BY name_thing ASC;
END;



скрипт php
// Не помогают никакие танцы с установками локали во всех сочетаних каких тока можно
// - плтаформа разработки виндовс сервер nginx 
//setlocale(LC_ALL, 'ru-RU.utf8');
//setlocale(LC_COLLATE, 'ru-RU.utf8');
//setlocale(LC_CTYPE, 'ru-RU.utf8');
//header("Content-type: text/html; charset=ru-RU.utf8");
//header("Content-type: text/html; charset=windows-1251");
//echo 'banks1'; setlocale(LC_ALL, 'Russian_Russia.65001')
//setlocale(LC_ALL, "Russian_Russia.65001");
//header("Content-type: text/html; charset=ru-RU.UTF8");
// ровно не помогает и вооще никак не влияет на результат установка параметра 
// кодировки при коннекте к БД
conn = oci_connect( $this->dbuser, $this->dbpass, $this->dbconnection_string, 'AL32UTF8' );
// послдний параметр был и просто UTF8, UTF-8, utf8, utf-8, Russia_Russian.UTF8 итд - разницы никакой
// не помогала установка переменных окружения LANG, NLS_LANG
...   
    if( $obj->getnamelist($res) ) {
     print_r($res); //печатает квадратики вместо русских символов если странице в бравзере установать принудительно кодировку UTF8 
      echo json_encode($res); // там где поля содержащие русские строки null
        $n = count($res);
        for($i = 0; $i < $n; $i++) {
            $res[$i] = array_map("ToUTF8", $res[$i]); // функция котроая для каждой строчки массива принудительно через iconv конвертит в UTF8 - решение сакс имхо
        }    
	print_r($res); // после переконвертации все русские символы и строки отображаются корректно совершенно
        echo json_encode($res); // массив JSON сформирован корректно  - аякс счастлив
        }
    exit();
1 окт 12, 11:07    [13248058]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Все очень просто: обратись к ХП из SQL*Plus. Если в нем вывод будет нормальным, значит Oracle тут ни причем.

PS
В реале при передаче данных с сервера на клиент, происходит перекодировка символов из кодировки сервера в кодировку клиента.
Чти доку Globalization Support Guide
1 окт 12, 11:39    [13248311]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
LowCoder
Member

Откуда:
Сообщений: 150
вывел запрос в sql plus - кракозябры. Значит таки на стороне БД проблема. А что можно сделать? Установка переменной окружения NLS_LANG в AL32UTF8 или Russian_Russia.UTF8 эффекта не дают.
1 окт 12, 15:40    [13250305]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51796

LowCoder
вывел запрос в sql plus - кракозябры. Значит таки на стороне БД проблема.

Нет, на стороне проблема была бы если бы DUMP() показывал неверные коды. А то, что ты
описываешь - неправильная настройка NLS_LANG. Десять чайников из десяти называют
"кракозябрами" вполне нормальный UTF8.

Posted via ActualForum NNTP Server 1.5

1 окт 12, 16:16    [13250717]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
LowCoder
Member

Откуда:
Сообщений: 150
А как настроить правильно?
1 окт 12, 17:02    [13251164]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51796

LowCoder
А как настроить правильно?

В соответствии с Globalization Guide там надо прописать ту кодировку, в которой ты хочешь
получать текстовые данные от Оракула.

Posted via ActualForum NNTP Server 1.5

1 окт 12, 17:19    [13251308]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
LowCoder
Member

Откуда:
Сообщений: 150
а где именно прописать така как гайд более чем объемный а мне вот сейчас надо прям.
1 окт 12, 17:43    [13251560]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51796

LowCoder
где именно прописать

Там, откуда используемый софт эти настройки берёт. Откуда мне знать что там в этом кривом
ПыхПыхе наворочено?..

Posted via ActualForum NNTP Server 1.5

1 окт 12, 18:48    [13251985]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
LowCoder
Member

Откуда:
Сообщений: 150
Оххх . так там (в смысле в пыхе) и вся трабла что единственная OCI функция гдк это прописанно это функция connect но как я писал в самом начале измененеи этого параметра не влияет на результат никак. Вернулись к тому от чего начали.
1 окт 12, 18:54    [13251998]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51796

LowCoder
единственная OCI функция гдк это прописанно это функция connect

Да щаззз... В OCI у функции connect нет параметров окружения. Они задаются при создании
окружения. И если не заданы - берутся из переменных окружения/реестра. И превосходно
работают. Так что проблемы ПыхПыха это проблемы ПыхПыха.

Posted via ActualForum NNTP Server 1.5

1 окт 12, 19:31    [13252171]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
sapzvezda
Member

Откуда:
Сообщений: 291
LowCoder, проект то php надеюсь в UTF-8? На всякий случай спросил =)
1 окт 12, 23:21    [13252989]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
LowCoder
Member

Откуда:
Сообщений: 150
я не совсем понимю что значит проект но везде прописанно установка локали в утф8 и посылка хидеров в ней же
потом после принудительной конвертации все вывводится на экран корректно
2 окт 12, 13:09    [13255147]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с выводом русских букв Oracle 11.2gXE + php  [new]
sapzvezda
Member

Откуда:
Сообщений: 291
LowCoder, сам файлик php в какой кодировке?

К сообщению приложен файл. Размер - 22Kb
2 окт 12, 13:18    [13255230]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить