powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Как правильно настроить UTF8 для консоли и СУБД?
7 сообщений из 7, страница 1 из 1
Как правильно настроить UTF8 для консоли и СУБД?
    #37994299
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть сервер с юникодной консолью (CentOS, LANG=en_US.UTF-8).
Есть Perl 5.14.2 и pl-файл в юникодной кодировке.
Файл примерно такой:
Код: 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.
#!/usr/bin/perl -C -w

use strict;
use warnings;
use utf8;
use DBI;
use JSON::RPC::Client;
use Data::Dumper;
binmode(STDOUT,':utf8');
...
{
  $meta = {};
  $meta->{sql} = {};
  my ($group,$block);
  while (my $line = <DATA>)
  {
    chomp $line;
    if ($line =~ /^{(\w+)_(\w+)}$/)
    {
      $group = $1;
      $block = $2;
      $meta->{$group}->{$block} = ($group eq 'sql' ? '' : []);
    }
    else
    {
      if (defined($group) && defined($block))
      {
        if ($group eq 'sql')  { $meta->{$group}->{$block} .= $line . "\n" }
        else                  { push @{$meta->{$group}->{$block}}, $line }
      }
    }
  }
}

$dbh = &dblink();
print "Проверка1\n";
print Dumper(&sqlcmd_get('test'));
$dbh->disconnect();

sub dblink()
{
  $ENV{'NLS_LANG'} = 'RUSSIAN_CIS.UTF8';
  my $dbh = DBI->connect('dbi:Oracle:host=host;sid=billing;port=1521', 'user', 'password', {RaiseError => 0, AutoCommit => 0} );
  $dbh->do("ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '. '");
  $dbh->do("ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD'");
  $dbh->do("ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'YYYY-MM-DD HH:MI:SS'");
  return $dbh;
}

sub sqlcmd($;$)
{
  my $sql = shift||'';
  my $params = shift;
  return undef unless (grep {$cmd eq $_} qw(check execute fetch get));
  $sql = $meta->{'sql'}->{$sql} if (exists($meta->{'sql'}->{$sql}));
  my $q = $dbh->prepare($sql);
  if ($params && ref($params) eq 'HASH')
  {
    $q->bind_param(":$_", $params->{$_}) foreach keys(%{$params});
  }
  my $ret = $q->execute();
  my $row = $q->fetchrow_hashref;
  return $row;
}


__DATA__

{sql_test}
select 'Проверка2' as TEST, ACCOUNT_ID, DESCRIPTION from ACCOUNTS where ACCOUNT_ID = 81



По запуску скрипт выдает такой результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
Проверка1
$VAR1 = {
          'TEST' => "\x{41f}\x{440}\x{43e}\x{432}\x{435}\x{440}\x{43a}\x{430}2",
          'ACCOUNT_ID' => '81',
          'DESCRIPTION' => "\x{41e}\x{441}\x{43d}\x{43e}\x{432}\x{43d}\x{43e}\x{439} \x{441}\x{447}\x{435}\x{442}"
        };

Я так понимаю, что все юникодное, но от драйвера DBI данные неправильно конвертируются.
Для MySQL можно указать флаг ($dbh->{mysql_enable_utf8} = 1;), но для Oracle я подобного решения не нашел.
________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
Как правильно настроить UTF8 для консоли и СУБД?
    #37994311
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, если подобным скриптом записать в базу (через INSERT или UPDATE) кириллицу в pl-файле, то в БД она записывается правильно (кириллицей).
...
Рейтинг: 0 / 0
Как правильно настроить UTF8 для консоли и СУБД?
    #37994776
Шогал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что тут неправильного? Dumper при выводе эскейпит "непечатаемые" символы, а по его мнению всё что за пределами ASCII - непечатно. Description = "Основной счет".
...
Рейтинг: 0 / 0
Как правильно настроить UTF8 для консоли и СУБД?
    #37994870
Max ZemaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.,
На PHP так делается
Код: php
1.
2.
3.
4.
        function sqlLink($instance="db",$login="",$pwd=""){
                if($this->hLink = oci_pconnect($login,$pwd,$instance,'AL24UTFFSS')){
                   $this->connected=true;}
                else {...


На PERL должно быть аналогично

на крайний случай что то типа
Код: plsql
1.
2.
ALTER SESSION SET NLS_LANGUAGE='UTF8'
ALTER SESSION SET NLS_LANGUAGE='AMERICAN_AMERICA.UTF8'
...
Рейтинг: 0 / 0
Как правильно настроить UTF8 для консоли и СУБД?
    #37994890
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шогал, то есть это Dumper символы экранирует? Об этом не подумал, сейчас проверю.

Max ZemaN, вообще-то у меня NLS и так задается (переменной среды окружения). Проблема в том, как указать перлу, что DBI умеет работать с utf8. Я нашел, как подобное указать для MySQL, PostgreSQL и SQLite, однако для Oracle найти не смог.
...
Рейтинг: 0 / 0
Как правильно настроить UTF8 для консоли и СУБД?
    #37994894
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.Шогал, то есть это Dumper символы экранирует? Об этом не подумал, сейчас проверю.
Так и оказалось.
Код: plaintext
1.
2.
3.
4.
5.
6.
print "Проверка1\n";
my $res = &sqlcmd_get('test');
print $res->{'DESCRIPTION'} . "\n";
--
Проверка1
Основной счет
Вопрос закрыт.
...
Рейтинг: 0 / 0
Как правильно настроить UTF8 для консоли и СУБД?
    #37996740
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел хак, чтобы Dumper выводил юникод без экранирования.
Может кому пригодится.
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
use Data::Dumper;
$Data::Dumper::Useqq = 1;
{
  no warnings 'redefine';
  sub Data::Dumper::qquote
  {
    my $s = shift;
    return "'$s'";
  }
}
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Как правильно настроить UTF8 для консоли и СУБД?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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