powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle + PHP + кириллица. Не понимаю
40 сообщений из 40, показаны все 2 страниц
Oracle + PHP + кириллица. Не понимаю
    #34843556
Удаленно работаю с сервером Oracle. Пишу веб приложение на PHP.

Если коннекчусь к базе так OCILogon($Username,$Password, $Databasename); , то запрос Select comments from myTable вернет вопросики вместо русских букв.
Если при коннекте послать Charset: OCILogon($Username,$Password, $Databasename,"CL8MSWIN1251"); , в этом случае на страничке все отображается корректно.
Загвоздка в том что, не получается реализовать поиск по контенту таблицы, если в условии содержится кириллица.
Например Select comments from myTable where comments like '%к%' не вернет ничего, хотя буква "к" содержится в комментариях
а что-то вроде Select comments from myTable where comments like '%w%' вернет верный результат

select * from nls_database_parameters возвращает следующее:

NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET CL8MSWIN1251
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET UTF8
NLS_RDBMS_VERSION 9.2.0.4.0

Подскажите пожалуйста, что не так. Как исправить положение ? Что нужно сделать?
Неделю уже над этим бьемся. Если надо сделаем необходимые настройки на сервере.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34843579
iDesperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в поиск ходи - под *nix апач должен видеть переменую NLS_LANG до старата. пропиши NLS_LANG и наступит счастье
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34843679
Искал, прописывали NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
Безрезультатно :(
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34843687
iDesperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Твилинев ДмитрийИскал, прописывали NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
Безрезультатно :(
если бы прописал - работало бы
куда прописывал то ?
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34843699
masteroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твилинев ДмитрийНапример Select comments from myTable where comments like '%к%' не вернет ничего, хотя буква "к" содержится в комментариях
а в этом поле comments точно есть маленькая буква "к"? просто судя по настройкам у вас будет сравнение по кодам символов и "К"<>"к"
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34843731
masteroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Твилинев Дмитрий
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CHARACTERSET CL8MSWIN1251

авторесли бы прописал - работало бы
куда прописывал то ?
при NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251 так и должно быть. так что правильно прописывал
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34843787
iDesperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
masteroid
при NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251 так и должно быть. так что правильно прописывал

что должно быть ? квадратики вместо рус букв ??
автор"Если коннекчусь к базе так OCILogon($Username,$Password, $Databasename);, то запрос Select comments from myTable вернет вопросики вместо русских букв."

апач явно не в курсе про переменую среды NLS_LANG
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34843879
masteroid Твилинев ДмитрийНапример Select comments from myTable where comments like '%к%' не вернет ничего, хотя буква "к" содержится в комментариях
а в этом поле comments точно есть маленькая буква "к"? просто судя по настройкам у вас будет сравнение по кодам символов и "К"<>"к"
Буква конечно есть. А про "у вас будет сравнение по кодам символов и "К"<>"к"" не понял..
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34843961
iDesperado Твилинев ДмитрийИскал, прописывали NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
Безрезультатно :(
если бы прописал - работало бы
куда прописывал то ?

Прописывали в apachectl
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34844312
iDesperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Твилинев Дмитрий iDesperado Твилинев ДмитрийИскал, прописывали NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
Безрезультатно :(
если бы прописал - работало бы
куда прописывал то ?

Прописывали в apachectl

<? phpinfo(); ?> эту переменую видит ?
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34844561
нет, в phpinfo() ее не видно
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34844619
iDesperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Твилинев Дмитрийнет, в phpinfo() ее не видно

чудеса, да ? :)
давай отгадаю: карежишь apachectl, а рестартишь бинарник :)
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34844738
cherva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кракозябры в браузере?
Для начала посмотри, какая кодировка у тебя стоит для страницы:
автор<meta http-equiv=Content-Type content="text/html; charset=
Если авторwindows-1251 тогда смотри, какую кодировку автоматом ставит браузер.
Это очень похоже (~90%) на то, что страница в кодировке UTF-8, а строки - в windows-1251...
Если кодировка страницы/сайта критична, то тогда придётся прогонять строки через перекодировщик перед генерацией страницы.
Что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	function unhtmlentities ($string) {
		// Get HTML entities table
		$trans_tbl = get_html_translation_table (HTML_ENTITIES, ENT_QUOTES);
		// Flip keys<==>values
		$trans_tbl = array_flip ($trans_tbl);
		// Add support for ' entity (missing in HTML_ENTITIES)
		$trans_tbl += array(''' => "'");
		// Replace entities by values
		return strtr ($string, $trans_tbl);
	}
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34844942
iDesperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ага, NLS_LANG который видит апач зависит от кодировки у бровсера :)
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34845186
masteroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ещё у апача есть параметр, кажется, default_charset, который определяет, тег с какой кодировкой вставить. если кодировка не указана источником (скриптом).
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34845437
Hanatsu-tori
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Переменные окружения, чтобы Апач видел можно в httpd.conf прописывать.
SetEnv NLS_LANG=....

Тогда он увидит их.
Я в своё время оч долго и упорно пытался прописать ORACLE_HOME, ORACLE_SID etc.

Если через SetEnv, то в phpinfo() нормально показывается
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34845566
приписали в httpd.conf SetEnv.
добавили AddDefaultCharset windows-1251
Рестартовали сервер.

в результате phpinfo() выдает в разделе
Apache Environment
NLS_LANG American_America.CL8MsWin1251

PHP Variables
_SERVER["NLS_LANG"] American_America.CL8MsWin1251

результаты выборки прежние :(


Для cherva
Проблема не в том, как вывести на страницу. Это получается (см. первый топик). проблема в том, что на сервер видимо кириллица летит перекодированная, в результате не могу сделать контекстный поиск по таблице...

Есть еще у кого нидь предложения ?
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34846380
MaineCoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Твилинев Дмитрийприписали в httpd.conf SetEnv.
добавили AddDefaultCharset windows-1251
Рестартовали сервер.


результаты выборки прежние :(

Из под какого юзера стартует Апач? Что есть ораклового в его переменных окружения?
Ну или, проще, запустить sqlplus из под этого юзера и посмотреть результаты запросов...
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34846616
cherva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Твилинев Дмитрий
Для cherva
не могу сделать контекстный поиск по таблице ...

Простите, невнимательно вчитался в проблему.

А не пробовали ли Вы использовать для коннекта к БД библиотеку ADODB ?
Там на уровне сессии возможно применить NLS_*, что кстати Вы можете сделать и самостоятельно, к примеру:
Код: plaintext
1.
2.
3.
4.
$conn=&ADONewConnection('oci8');
/* или как у Вас описывается дескриптор подключения*/
$conn->NLS_DATE_FORMAT =  'DD.MM.YYYY HH24:MI:SS';
$conn->NLS_LANG = 'American_America.CL8MsWin1251';
Я поначалу тоже плясал с бубном вокруг настроек окружения, пока не применил библиотеку. Теперь и на хостингах и в интранет нет никаких проблем - можно заниматься именно кодингом, без оглядки на окружение...
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34846654
iDesperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Твилинев Дмитрий
Есть еще у кого нидь предложения ?

угу, разобратся кто виноват: запустите скрипт прямо из командной строки без апача.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34847204
cherva Твилинев Дмитрий
Для cherva
не могу сделать контекстный поиск по таблице ...

Простите, невнимательно вчитался в проблему.

А не пробовали ли Вы использовать для коннекта к БД библиотеку ADODB ?
Там на уровне сессии возможно применить NLS_*, что кстати Вы можете сделать и самостоятельно, к примеру:
Код: plaintext
1.
2.
3.
4.
$conn=&ADONewConnection('oci8');
/* или как у Вас описывается дескриптор подключения*/
$conn->NLS_DATE_FORMAT =  'DD.MM.YYYY HH24:MI:SS';
$conn->NLS_LANG = 'American_America.CL8MsWin1251';
Я поначалу тоже плясал с бубном вокруг настроек окружения, пока не применил библиотеку. Теперь и на хостингах и в интранет нет никаких проблем - можно заниматься именно кодингом, без оглядки на окружение...

Используется компонента, которая работает как раз таки с ADODB. В документации ADODB видел что можно использовать (и используется) аlter session, а вот такие штуки не видел. Но попробую...
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34847687
cherva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Твилинев Дмитрий... как раз таки с ADODB. В документации ADODB видел что можно использовать (и используется) аlter session, а вот такие штуки не видел. Но попробую...
7. Dates and Datetime in ADOdb , а я действовал по аналогии... И, что характерно, прекрасно работает!
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34855149
cherva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Твилинев Дмитрий:
Используете ли Вы вызов хранимых процедур через ADODB? Если ДА, то как?
В документации нашёл только работу с курсорами, но это не совсем то, что мне надо...
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34855328
Alex Roudnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iDesperado masteroid
при NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251 так и должно быть. так что правильно прописывал

что должно быть ? квадратики вместо рус букв ??
автор"Если коннекчусь к базе так OCILogon($Username,$Password, $Databasename);, то запрос Select comments from myTable вернет вопросики вместо русских букв."

апач явно не в курсе про переменую среды NLS_LANG

Ну а как сам автор думает - язык американский, откуда там русские буквы?? Это для апаче не русские буквы а глюки, вот он их и рисует как глюки.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34855393
iDesperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex Roudnev
Ну а как сам автор думает - язык американский, откуда там русские буквы?? Это для апаче не русские буквы а глюки, вот он их и рисует как глюки.
а какое отношение имеет язык к кодировки ?

oracle docs
The NLS_LANG parameter uses the following format:

NLS_LANG = LANGUAGE_TERRITORY.CHARACTER_SET

This format is explained in the following table:
Parameter Description
LANGUAGE Specifies the language for displaying product messages, day names, and month names in SQL.

Oracle Database Globalization Support Guide provides more information about languages.
TERRITORY Specifies the cultural-specific conventions for date, number, time, and monetary formatting.

Oracle Database Globalization Support Guide provides more information about territory conventions.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34856521
cherva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну что вы к апачу прицепились?..
У автора поиск не шел - на сессию при коннекте прописал - и всё пошло.
А апач, может не только с Ораклом работает? Зачем ему другие кодировки нужны?
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34858765
Alex Roudnev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iDesperado Alex Roudnev
Ну а как сам автор думает - язык американский, откуда там русские буквы?? Это для апаче не русские буквы а глюки, вот он их и рисует как глюки.
а какое отношение имеет язык к кодировки ?

oracle docs
The NLS_LANG parameter uses the following format:

NLS_LANG = LANGUAGE_TERRITORY.CHARACTER_SET

This format is explained in the following table:
Parameter Description
LANGUAGE Specifies the language for displaying product messages, day names, and month names in SQL.

Oracle Database Globalization Support Guide provides more information about languages.
TERRITORY Specifies the cultural-specific conventions for date, number, time, and monetary formatting.

Oracle Database Globalization Support Guide provides more information about territory conventions.


Ну так где у него прописана кодировка для отображения текста? Я там видел лишь _все по американски_, а в американском нету русских значков - что должен Оракл рисовать на их месте??
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #34860010
iDesperado
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex Roudnev
Ну так где у него прописана кодировка для отображения текста? Я там видел лишь _все по американски_, а в американском нету русских значков - что должен Оракл рисовать на их месте??
как где ? справа от точки CL8MSWIN1251, все верно. язык отвечает за "language for displaying product messages, day names, and month names in SQL." - это вполне естественно получать по человечески ерроры и даты, к значкам имеет отношение CHARACTER_SET который задается справа от точки и задан верно.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Oracle + PHP + кириллица. Не понимаю
    #39277229
lfmr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Была такая же проблема.
1. Необходимо что бы кодировка совпадала с той которая на сервере.
2. Написать NLS_LANG = LANGUAGE_TERRITORY.CHARACTER_SET.
В моем случае (Centos 7) написать нужно было в /etc/sysconfig/httpd
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39277235
lfmr1. Необходимо что бы кодировка совпадала с той которая на сервере.
Ложь.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39277267
lfmr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Иногда лучше жевать, поясните?
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39277272
lfmrИногда лучше жевать, поясните?
Уж сколько примеров опубликовано... один фиг мало кто осознал.
Кодировка, заказанная клиентом при установлении соединения, должна совпадать с кодировкой, в которой работает клиент .
Кодировка сервера должна являться "суперсетом" по отношению к кодировке клиента.
Точка.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39277524
lfmr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не претендую на звание специалиста по oracle, я лишь описал практический метод, с которым у меня все заработало.
Получается по вашим словам, что я прописать могу любую кодировку и страну? Лень пробовать, но думаю что так работать не будет.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39277646
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lfmrПолучается по вашим словам, что я прописать могу любую кодировку и страну? Лень пробовать, но думаю что так работать не будет.Включи мозг:ТыщуразужпояснялКодировка сервера должна являться "суперсетом" по отношению к кодировке клиента.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39277658
Думатель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lfmrЛень пробовать, но думаю что так работать не будет.
Думать - это хорошо.
А когда лень изучать матчасть - то просто необходимо.
Только думать надо правильно, а не как попало.
К примеру, стоит подумать - а зачем oracle разделил кодировки сессии и сервера?
Для каких целей клиент вообще должен эту самую кодировку указывать и почему выбранную кодировку нельзя поменять после установления соединения?
Если думать тоже не получается - то можно хотя бы
поискать готовые ответы
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39277955
lfmr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думатель,
давайте не будем разводить флуда. Я считаю, что на форуме либо делишься знаниями, решениями, методами или хотя бы ссылками на первоисточник мануалов, либо вообще не пишешь. Лично мне Oracle не очень нужен в данный момент, просто понадобилось подключиться к одной базе и я столкнулся с проблемой кодировки, почитал и сделал так что бы заработало. Поделился этим в теме которую читал вот и все. Что то не так - давайте ссылку на первоисточник. Больше писать тут не буду, все что я хотел сказать уже сказал.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39277965
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lfmrБольше писать тут не буду,Правильно. Недалёких неверных выводов, преподносимых как великие откровения, - пруд пруди.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39278062
Не нуди
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
lfmrЯ считаю, что на форуме либо делишься знаниями
Поделился:
19432314

lfmr, решениями, методами
Тоже поделился, там ссылко есть:
19435179

lfmr или хотя бы ссылками на первоисточник мануалов
Наслаждайся, мне не жалко:
https://docs.oracle.com/cd/B28359_01/server.111/b28298/ch2charset.htm#i1007681

И вот тебе цитата, один фиг читать не будешь, ты же занятой человек... обрати особое внимание на вторую часть, это написано специально для таких как ты:
Database Globalization Support GuideSetting the NLS_LANG parameter properly is essential to proper data conversion . The character set that is specified by the NLS_LANG parameter should reflect the setting for the client operating system . Setting NLS_LANG correctly enables proper conversion from the client operating system character encoding to the database character set.
When these settings are the same , Oracle Database assumes that the data being sent or received is encoded in the same character set as the database character set , so character set validation or conversion may not be performed . This can lead to corrupt data if conversions are necessary .

lfmr почитал и сделал так что бы заработало.
Ты либо не то читал, либо не понял прочтенного, либо читал таких же ленивых и ужасно занятых людей, которые раз за разом копипастят по форумам не просто неверный, но ПЛОХОЙ совет.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39278076
Дополним
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и в догонку - помимо второй у гайда есть еще третья глава , сфокусированная на клиенте, где вендор продублировал послание ленивым и занятым:

Database Globalization Support Guide
3 Setting Up a Globalization Support Environment
Choosing a Locale with the NLS_LANG Environment Variable Should the NLS_LANG Setting Match the Database Character Set?
The NLS_LANG character set should reflect the setting of the operating system character set of the client. For example, if the database character set is AL32UTF8 and the client is running on a Windows operating system, then you should not set AL32UTF8 as the client character set in the NLS_LANG parameter because there are no UTF-8 WIN32 clients. Instead, the NLS_LANG setting should reflect the code page of the client. For example, on an English Windows client, the code page is 1252. An appropriate setting for NLS_LANG is AMERICAN_AMERICA.WE8MSWIN1252.

Setting NLS_LANG correctly enables proper conversion from the client operating system character set to the database character set. When these settings are the same, Oracle Database assumes that the data being sent or received is encoded in the same character set as the database character set, so character set validation or conversion may not be performed. This can lead to corrupt data if the client code page and the database character set are different and conversions are necessary.
...
Рейтинг: 0 / 0
Oracle + PHP + кириллица. Не понимаю
    #39278818
lfmr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ок, почитаю.
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Oracle + PHP + кириллица. Не понимаю
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]