powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Perl] Не сохраняются турецкие буквы в таблицу Oracle
8 сообщений из 33, страница 2 из 2
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38249248
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mops, $ENV{NLS_LANG} можно попробовать выставить точно такой же, как кодировка varchar2 в БД ( CL8ISO8859P5 ) - тогда оно наверное и вставлять будет - байт в байт.
что то типа:
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P5
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38249347
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если все через юникод = тоже вроде работает. исходник в 1251.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
use Encode; 
use DBD::Oracle qw(:ora_types);
use DBI;  

$ENV{NLS_LANG}="AMERICAN_AMERICA.UTF8";
my ($dbname,$user,$passwd)=(*********);
$dbh = DBI->connect("dbi:Oracle:$dbname", $user, $passwd);  

$sql=  "insert into ****.xxtest ( nv, v ) values (?,?)";
$sql_unicode = decode("windows-1251", $sql);
 
$par1="мама мыла раму";
$par2="на дворе дрова";

$par1_unic= decode("windows-1251", $par1);
$par2_unic= decode("windows-1251", $par2);

$cmd = $dbh->prepare($sql);
$cmd->bind_param(1, $par1_unic);
$cmd->bind_param(2, $par2_unic);

$cmd->execute();
$dbh->commit();
$dbh->disconnect();
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38250012
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

Решил на время отказаться от файла и добавил константу в программу ĞpşŞğöVÖ.
Попробовал переводить в UTF8, в таблицу вставляется ?p????V?, установил кодировку сессии как кирилическую (AMERICAN_AMERICA.CL8ISO8859P5), вставляется аpўо№іVж.
Продолжаю искать решение.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38250083
mhx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mhx
Гость
Код: perl
1.
use open qw(:std :utf8);
open OUTFILE, "Encode::from_to($l_temp_3, 'cp1254', 'UTF-16BE');

Зачем тут from_to, когда прочитанные из файла строки находятся уже в кодировке utf8? Вы же указали это первыми двумя строками.
PS. Может, стоит установить кодировку сессии юникодную?
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38250097
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mopsVladimir Baskakov,

Решил на время отказаться от файла и добавил константу в программу ĞpşŞğöVÖ.
Попробовал переводить в UTF8, в таблицу вставляется ?p????V?, установил кодировку сессии как кирилическую (AMERICAN_AMERICA.CL8ISO8859P5), вставляется аpўо№іVж.
Продолжаю искать решение.
в фаре -
1) входим в режим редактирования
2) выставляем кодировку 8859-5
3) вставляем текст аpўо№іVж
4) меняем кодировку на анси-турецкую - 1254
5) - видим нужное слово по турецки!

Вы в таблице видите русские буковки ровно потому, что шрифт в отображении не тот. Русский. Турецкий покажет правильное турецкое слово. Как я и говорил - когда NLS_LANG у сессии и базы совпадает, вставка прошла - байт в байт. Правильно.
==============
Дальше - возьмите мой пример, и сделайте вставку в nvarchar2 поле.
набивайте его в фаре, в турецкой 1254 кодировке, исправьте 1251 на 1254 везде.
должно стать нормально.

$ENV{NLS_LANG}="AMERICAN_AMERICA.UTF8";
- должно быть. Это Вам еще на первой страничке говорили.... до меня....
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38250275
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

И ведь точно всё дело только в отображении, вы шайтан Владимир, сам я даже до этого не додумался. Получается то что я вижу у себя POLнPORT KнMYA SAN.VE TнC.A.о. (кодировка iso-8859-5) турки увидят в своих клиентах POLİPORT KİMYA SAN.VE TİC.A.Ş. (кодировка cp1254). Ведь я правильно мыслю?

А вот с юникодом не получается, я устанавливал кодировку AMERICAN_AMERICA.UTF8 и делал преобразование в utf8
$l_temp_3 = "ĞpşŞğöVÖ";
$l_temp_3 = Encode::decode("cp1254", $l_temp_3);
В итоге в поля с типом nvarchar2 и varchar2 вставляется ?p????V?
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38250531
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня с турецким юникодом тоже не получилось
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
use Encode; 
use DBD::Oracle qw(:ora_types);
use DBI;  

$ENV{NLS_LANG}="AMERICAN_AMERICA.UTF8";
my ($dbname,$user,$passwd)=('main.world','budget','butzschebudg');
$dbh = DBI->connect("dbi:Oracle:$dbname", $user, $passwd, {ora_charset => 'AL32UTF8'});  
$dbh->{ora_ph_csform} = SQLCS_NCHAR;

open $f ,">enc.txt";

$sql=  "insert into transfert.xxvbtest ( nv, v ) values (?,?)";
$sql_unicode = decode("windows-1251", $sql);

$cmd = $dbh->prepare("delete from transfert.xxvbtest");
$cmd->execute();
$cmd = $dbh->prepare($sql_unicode);
 
$par1="GpsSgoVOРpюЮрцVЦ";
$par2="GpsSgoVOРpюЮрцVЦ";

$par1_unic= decode("windows-1254", $par1, { ora_csform => SQLCS_NCHAR });
$par2_unic= decode("windows-1254", $par2, { ora_csform => SQLCS_NCHAR });
print $f "$par1_unic\n";

$cmd->bind_param(1, $par1_unic);
$cmd->bind_param(2, $par2_unic);

$cmd->execute();

$par1="Кошка";
$par2="Мышка";

$par1_unic= decode("windows-1251", $par1, { ora_csform => SQLCS_NCHAR });
$par2_unic= decode("windows-1251", $par2, { ora_csform => SQLCS_NCHAR });

print $f "$par1_unic\n";


$cmd->bind_param(1, $par1_unic);
$cmd->bind_param(2, $par2_unic);

$cmd->execute();

$dbh->commit();
$dbh->disconnect();
$f->close();


вставляет GpsSgoVOGpsSgoVO - те убирает диакритические значки (ĞpşŞğöVÖ).
Нормальные русские слова нормально вставляет, делая из них нормальный юникод, а турецкий - искажает. Какие настройки глобализации отвечают за вопрос - я не знаю, попробуйте переспросить в разделе оракла.

Хорошая новость! вот такая .ctl для SqlLdr
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
load data
characterset 'UTF8'
infile enc.txt
preserve blanks
into table transfert.xxvbtest append
fields terminated by ';'
TRAILING NULLCOLS
(
    nv
)

правильно загоняет вот такой utf8 текстовый файл изготовленный perl-ом
GpsSgoVOĞpşŞğöVÖ
Кошка

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
use Encode; 
open $f ,">enc.txt";

$par1="GpsSgoVOРpюЮрцVЦ";

$par1_unic= decode("windows-1254", $par1, { ora_csform => SQLCS_NCHAR });
print $f "$par1_unic\n";

$par1="Кошка";

$par1_unic= decode("windows-1251", $par1, { ora_csform => SQLCS_NCHAR });

print $f "$par1_unic\n";

close($f);


Так что вероятно - особенность где-то в слое обработки юникода DBD::Oracle.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38251179
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

Спасибо за помощь, попробую продолжить тему в оракловой ветке.
...
Рейтинг: 0 / 0
8 сообщений из 33, страница 2 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Perl] Не сохраняются турецкие буквы в таблицу Oracle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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