powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Perl] Не сохраняются турецкие буквы в таблицу Oracle
33 сообщений из 33, показаны все 2 страниц
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38243676
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Пишу программу которая извлекает данные из текстового файла в кодировке cp1254 (турецкий язык) и помещает их в таблицу базы данных Oracle с кодировкой CL8ISO8859P5. Для этого сделал таблицу с полями принимающими юникод (nvarchar2). Пробовал использовать библиотеку Encode, пробовал менять переменные окружения текущей сессии, но всё равно специфические турецкие буквы меняются на знаки вопроса (POL??PORT K??MYA SAN.VE T??C.A.??.) или в таблицу вставляются пустые строки. Если считанные данные вставлять в другой текстовый файл, то буквы сохраняются, и если сделать вставку из другой таблицы, где уже есть турецкие буквы, в таблицу используя запрос, минуя переменные, то буквы тоже сохраняются. Пробовал получить дамп строки до всех преобразований, получил POL\x{130}PORT K\x{130}MYA SAN.VE T\x{130}C.A.\x{15e}. Помогите пожалуйста, уже три недели мучаюсь.

Код: php
1.
2.
3.
$ENV{ORA_NCHAR_LITERAL_REPLACE} = 'TRUE';
$ENV{NLS_DATE_FORMAT} = 'DDMMYYYY';
$ENV{NLS_LANG} = "AMERICAN_AMERICA.TR8MSWIN1254";



Код: php
1.
open OUTFILE, "<:encoding(cp1254)", $in_file || die "Error open file ${file_name}: $!";



Код: 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.
$l_temp_3 = $col_09;
$insert1 = "INSERT INTO xxfin.xxfin_test_load_file_2
                   (text_tr,
                    text_en,
                    creation_date)
                 VALUES
                   (?, 
                    ?,
                    sysdate)";
     $i1 = $dbh_ora->prepare($insert1);
     if (!$i1) 
       {
        print STDERR "Error:" . $dbh_ora->errstr() . "\n";
        exit 1;
       }
              
     Encode::from_to($l_temp_3, 'cp1254', 'UTF-16BE');
     
     $i1->bind_param(1, $l_temp_3);
     $i1->bind_param(2, $col_09);
     if (!$i1->execute())
       {
        print STDERR "Error:" . $i1->errstr() . "\n";
        exit 1;
       }
     $i1->finish();
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38244771
Gijad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mops,
Забудьте про все эти кодировки. Приводите всё к unicode.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38245218
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gijadmops,
Забудьте про все эти кодировки. Приводите всё к unicode.
Да я бы с радостью, что в принципе и пытаюсь сделать
Код: php
1.
2.
Encode::_utf8_off($l_temp_3);
Encode::from_to($l_temp_3, 'cp1254', 'UTF-16BE');


Но в таблицу вставляются пустые значения.

Пробовал приводить данные к utf8, тогда в таблицу вставляется POL????PORT K????MYA SAN.VE T????C.A.?????.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38245237
mhx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
mhx
Гость
Был бы мускуль, вам бы тут быстро кучу советов надавали, а так...
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38245272
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mhx,
Мне кажется здесь дело не в базе данных, а в способе передать в неё данные в нужном виде. Где то происходит неявная перекодировка данных, потому что схема insert into <table1> select <field> from <table2> проходит без проблем.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38245282
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с Ораклом через что соединяешься?
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38245286
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S_Andrey_A,

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

Если ты про библиотеки, то использую в программе
Код: php
1.
2.
use DBI qw(:sql_types);
use DBD::Oracle qw(:ora_types);
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38245312
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вернее только
Код: php
1.
use DBI qw(:sql_types);



Вот полный текст программы
Код: 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.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
#!/usr/local/bin/perl                                     
#
#

  use DBI qw(:sql_types);
#  use DBD::Oracle qw(:ora_types);
  use Encode qw(encode decode from_to);
  use File::Copy;
  use strict;
  use utf8;
  use open qw(:std :utf8); 
  use Data::Dumper;
#  use Text::Iconv;
#------ my parameters --------------
  my $org_id;
  my $file_name;
  my $user;
  my $password;
  my $dsn_ora;
  my $dbh_ora;
  my $sys_arg;
  my $my_arg;
  my $all_arg;
  my $pone;
  my @p_arg;
  my $j;
  my $in_file;
  my $str;
#-----------------------------------
  my $col_01;
  my $col_02;  
  my $col_03;
  my $col_04;
  my $col_05;
  my $col_06;
  my $col_07;
  my $col_08;
  my $col_09;
  my $col_10;
  my $col_11;
  my $col_12;
#-----------------------------------
  my $insert1;
  my $i1;
#-----------------------------------
  my $FCP_LOGIN;
  my $l_temp_3;
  
  binmode (STDERR, ':utf8');

  my $OA_HTML = $ENV{OA_HTML};
  my $APPL_OUT = $ENV{APPLCSF}.'/'.$ENV{APPLOUT};
  my $APPL_TOP = $ENV{APPL_TOP};

  if (@ARGV[0] eq '')
    {
     print "Error! No enter parameters. \n";
     exit(1);
    }  

## for 11i
##------------------------------------------------
  $all_arg = @ARGV[0];
    $pone=0;
    
     for ($j = 1; $j < scalar(@ARGV); ++$j){
       if((@ARGV[$j] =~ /^\"(\S+)\"/i)&&($pone==0)){
          $all_arg .= '  ' . @ARGV[$j];
	   $pone = 1;
	      }else{
	          $all_arg .= ' ' . @ARGV[$j];
		    }
		     }

### divide system and user parameters

  ($sys_arg, $my_arg ) = split(/  /, $all_arg);               

### take array @p_arg user parameters

  $my_arg = substr($my_arg, 1, length($my_arg)-2);

  @p_arg = split(/" "/, $my_arg);

  print STDERR "Start with parameters:\n";

  $org_id = @p_arg[0];
  $file_name = @p_arg[1];

  print STDERR "Org_id = $org_id \nFile_name = $file_name \n";

### Look system parameters
   if($sys_arg =~ /FCP_REQID=(\S+)\s+/i){
      print STDERR "FCP_REQID = $1\n";
      my $FCP_REQID = $1;
   }else{
      print STDERR "No parameter FCP_REQID\n";
      exit(1);
   }

   if($sys_arg =~ /FCP_LOGIN=\"(\S+)\"\s+/i){
      $FCP_LOGIN = $1;
   }else{
      print STDERR "No parameter FCP_LOGIN\n";
      exit(1);
   }

   if($sys_arg =~ /FCP_USERNAME=\"(\S+)\"\s+/i){
      my $FCP_USERNAME = substr($1,0,8);
   }else{
      print STDERR "No parameter FCP_USERNAME\n";
      exit(1);
   }

  $user = $FCP_LOGIN;
  $password = '';

  $ENV{ORA_NCHAR_LITERAL_REPLACE} = 'TRUE';
  $ENV{NLS_DATE_FORMAT} = 'DDMMYYYY';
  $ENV{NLS_LANG} = "TURKISH_TURKEY.TR8MSWIN1254";

##------ Connect --------------  
   $dsn_ora = 'dbi:Oracle:';
   $dbh_ora = DBI->connect($dsn_ora, $user, $password, {AutoCommit => 0});
   $dbh_ora->{pg_enable_utf8} = 1;
   if (!$dbh_ora) {
      print STDERR "\nConnection error\n";
      print STDERR "Error:" . $DBI::errstr . "\n";
      exit 1;
   }

   $dbh_ora->{LongReadLen} = 512 * 1024;

##---------- Open file -----------------
  $in_file = "${APPL_TOP}/xxupload/${file_name}";
  open OUTFILE, "<:encoding(cp1254)", $in_file || die "Error open file ${file_name}: $!";
#---------------------------------------
  while (<OUTFILE>)
    {
     $str = $_;
     next if (substr($str, 0, 1) eq '-');
     #------------------------------------------
     $col_01 = substr($str, 0, 5);     # B SUB
     $col_02 = substr($str, 6, 7);     # B HESAP
     $col_03 = substr($str, 14, 4);    # BNK
     $col_04 = substr($str, 19, 5);    # SUBE
     $col_05 = substr($str, 25, 19);   # ALACAK HESAP
     $col_06 = substr($str, 45, 18);   # TUTAR
     $col_07 = substr($str, 64, 3);    # DVZ
     $col_08 = substr($str, 68, 10);   # VADE TAR
     $col_09 = substr($str, 79, 30);   # ALACAKLI ADI
     $col_10 = substr($str, 110, 50);  # TGB HESAP ADI
     $col_11 = substr($str, 161, 40);  # ISLEM ACIKLAMASI
     $col_12 = substr($str, 202, 26);  # IBAN

     $insert1 = "INSERT INTO xxfin.xxfin_test_load_file_2
                   (text_tr,
                    text_en,
                    creation_date)
                 VALUES
                   (?, 
                    ?,
                    sysdate)";
     $i1 = $dbh_ora->prepare($insert1);
     if (!$i1) 
       {
        print STDERR "Error:" . $dbh_ora->errstr() . "\n";
        exit 1;
       }
     
     print STDERR "Dump col_09 = ", Dumper $col_09;
     print STDERR "1 col_09 = $col_09\n"; 
     print STDERR "\n";

     $l_temp_3 = $col_09;

     Encode::_utf8_off($l_temp_3);
     Encode::from_to($l_temp_3, 'cp1254', 'UTF-16BE');
#     Encode::_utf8_on($l_temp_3);
     print STDERR "Dump l_temp_3 = ", Dumper $l_temp_3;
     print STDERR "\n";
     print STDERR "1 l_temp_3 = $l_temp_3\n";
     printf STDERR ("2 l_temp_3 = %s\n", $l_temp_3);
     print STDERR "==============\n";

     $i1->bind_param(1, $l_temp_3);
     $i1->bind_param(2, $col_09, SQL_LONGVARCHAR);
     if (!$i1->execute())
       {
        print STDERR "Error:" . $i1->errstr() . "\n";
        exit 1;
       }
     $i1->finish();

    } #----------- while

  close STDERR;
  close OUTFILE;

  $dbh_ora->commit() or die "Error commit: $DBI::errstr\n";
  $dbh_ora->disconnect or warn "Error disconect: $DBI::errstr\n";
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38245318
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А NLS_LANG какой выставлен?
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38245324
S_Andrey_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну получается ты все конвертируешь в UTF а Оракл ждет турецкие буквы.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248458
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
S_Andrey_A,
Я пробовал разные NLS_LANG выставлять, не помогает.

База данных имеет кодировку CL8ISO8859P5, она не поймёт турецкие буквы. Единственный выход создавать юникодные поля в таблице (nvarchar2). Именно в формате UTF там и хранятся данные, это проверено когда делал обратную операцию, извлекал данные и таблицы и конвертировал их в турецкую кодировку и вставлял в файл и отправлял туркам (из UTF-16BE в cp1254).
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248599
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А sqlldr - точно не загружает?
mopsБаза данных имеет кодировку CL8ISO8859P5, она не поймёт турецкие буквы
а зачем ей говорить что они турецкие. Может ее обмануть и сказать что они как раз кирилические однобайтные 8859-5.
При загрузке в поле varchar2.
И перлу сказать то же самое. Байт - он байт и есть. Вот пусть и грузит. А как они потом покажуться - как клиент настроен? Ведь иногда же varchar2 поля выгружаются на нормальном (турецком) языке.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248635
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

Не получится, в турецком языке есть буквы которых нет в кирилице, а с ними как раз и проблема, поэтому не получится сохранить их как кирилические. А выгрузка из таблицы и загрузка в таблицу проходила только с полями nvarchar2.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248643
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Турецкая кодировка однобайтная?
TR8MSWIN1254?
И русская - однобайтная?
Так в каком смысле в русском языке нет турецких букв, а в турецком - русских?
если все 256 байтов - есть.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248736
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

Я вас понял.
Сообщил программе что у меня файл написан на кирилице
Код: php
1.
open OUTFILE, "<:encoding(iso-8859-5)", $in_file || die "Error open file ${file_name}: $!";


Убрал все перекодировки и просто вставил то что извлёк в таблицу.
По дампу видно что турецкие буквы были восприняты как русские POL\x{43d}PORT K\x{43d}MYA SAN.VE T\x{43d}C.A.\x{43e}. Получается строчка POLнPORT KнMYA SAN.VE TнC.A.о., но я не уверен что турки захотят что то городить у себя чтобы преобразовать эти русские буквы в свои турецкие, там нет программистов кто бы смог за это взяться.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248745
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А тип поля какой - юникодный или "нормальный"?
Я то говорю про varchar2, однобайтные поля.
mopsпотому что схема insert into <table1> select <field> from <table2> проходит без проблем.
какого типа поля в <table2> ? юникодные или однобайтные?

Если турки уже съели varchar2 - поля в русской локализации базы - то пусть и дальше едят.
(это конечно наверное нехорошо....)
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248791
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

Попробовал вставлять в поля разных типов. Если включена переменная окружения $ENV{NLS_LANG} = "TURKISH_TURKEY.TR8MSWIN1254", то и в varchar2 и в nvarchar2 вставляется POL??PORT K??MYA SAN.VE T??C.A.??. Убрав эту строчку получается POLаНPORT KаНMYA SAN.VE TаНC.A.аО., и в varchar2 и в nvarchar2, видно что турецкие буквы заменились на два символа аН и аО. Хотя в дампе по прежнему показывается POL\x{43d}PORT K\x{43d}MYA SAN.VE T\x{43d}C.A.\x{43e}.

А insert из таблицы в таблицу я делал на юникодных полях.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248812
mops
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получается хоть я и указываю кодировку файла
Код: php
1.
open OUTFILE, "<:encoding(iso-8859-5)", $in_file || die "Error open file ${file_name}: $!";

Всё равно турецкие буквы считываются как юникодные, а при вставке четыре символа из юникодного кода разбиваются по два они уже отображаются, что является неверным.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248857
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да не в этом дело.
либо
$dbh_ora->{pg_enable_utf8} = 1;
либо
use utf8;

либо, что самое вероятное
Encode::from_to($l_temp_3, 'cp1254', 'UTF-16BE');
- не надо ничего перекодировать! В UTF.

Попробуйте убрать эти строчки, пусть байты будут просто байтами, как они прочлись из файла!
(ну - по моему мнению).

У вас в тех varchar2() полях где уже есть - такие же сырые байты и положены (вероятно)
- ну или покажите определения полей где турецкие буковки залиты уже.
Если Вы их через SQLPlus выгрузите - оно и будет видно. (наверное)

залейте одну строчку через SQLLoader. Указав ему, что кодировка файла УЖЕ такая, как установлена в базе, и НЕ НАДО ничего делать кроме как заливать. НЕ НАДО решать какие буквы есть, каких - нет, не надо ничего перекодировать.


Выгрузите пару строчек из таблиц где турецкие буковки нормальные через SQLPLus, посмотрите - будет ли кодировка 1254, если нет - какая?

Выполните тест на перле - подконнектится, выполнить 1 жесткий инсерт без связанных переменных, безо всяких UTF. Правильно вставит? или нет. Потом его же с забинденными переменными, но без перекодировок, значения - константами в тексте скрипта. турецкими буквами в 1254.

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

http://search.cpan.org/~pythian/DBD-Oracle-1.23/Oracle.pm

CPAN use DBD::Oracle qw( SQLCS_IMPLICIT SQLCS_NCHAR );
...
$sth->bind_param(1, $value, { ora_csform => SQLCS_NCHAR } );
Говорят, что юникодные параметры надо биндить с довеском? не знаю, не пробовал.

Дальше. Про
$dbh_ora->{pg_enable_utf8} = 1;
- гугл говорит, что это флаг от постргесса.

На оракловой странице CPAN его нет.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248908
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дальше, попробуйте в среде разработки вставить запись с осмысленными турецкими буковками.
Если получится - посмотрите на языковые параметры в
select * from v$nls_parameters, выставьте аналогичные в PERL.
...
Рейтинг: 0 / 0
[Perl] Не сохраняются турецкие буквы в таблицу Oracle
    #38248931
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ничего не говорили про
NLS_NCHAR_CHARACTERSET.
Он какой?
Заведите тему аналогичную в разделе Oracle, там могут понять причину быстрее.

прагма
PERLDOCutf8 - Perl pragma to enable/disable UTF-8 (or UTF-EBCDIC) in source code http://perldoc.perl.org/utf8.html

Не влияет на прочитывание файла. Только на интерпретацию исходника. Оно зачем? в перлушке юникодных турецких букв нет.

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

Дело в том что я сейчас тренеруюсь на базе данных своего предприятия, здесь кодировка русская, и турецкие буквы я сохранял в полях типа nvarchar2(500). В дальнейшем буду цепляться через дблинк к турецкой базе и сохранять данные там (изначально я тренеровался на турецкой базе, но затем когда у меня возникли трудности, чтобы не забивать канал связи частыми запусками программы, я переключил свои тренеровки на нашу базу, что наверное неправильно, нужно снова вернуться на использование турецкой базы). Через тот же дблинк я забирал данные из Турции и вставлял в "русскую" таблицу в поля с типом nvarchar2 по схеме insert into <table1> select <field> from <table2>.

Прямую вставку из среды разработки я пробовал, в консоле запускал sqlplus, менял настройки сессии на турецкии и делал вставку. Вставку я делал в "русскую" базу в поле с типом nvarchar2.

Параметр NLS_NCHAR_CHARACTERSET что в турецкой базе, что в нашей AL16UTF16

Убрал вызов use utf8

Тип поля text_tr - nvarchar2(500). Я сделал аналогичное поле text_vr с типом varchar2(500) и сразу пробую вставить и в него.

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

Отказался от всех перекодировок, сделал в турецкой таблице поле с типом varchar2 и пробую вставить данные из файла туда. До этого пытался вставить в поля с типом nvarchar2, не знаю что на меня нашло, для их базы это же родной язык и она кодировку воспримет и без юникода. Но пока тоже не получается, если менять настройки сессии $ENV{NLS_LANG} = "TURKISH_TURKEY.TR8MSWIN1254"; то вставляется POL??PORT K??MYA SAN.VE T??C.A.??., если убрать смену настроек сессии, то вставляется POLФАPORT KФАMYA SAN.VE TФАC.A.Х?.

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


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