Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка юникодных символов в базу 
V
    Опции темы
infarch
Дата 5.9.2012, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Здравствуйте.

Помогите пожалуйста понять в чем ошибка. Мне нужно вставить строку с юникодными символами в базу Sql Server. Написал простенький скрипт для тестирования. Работает нормально под виндой, но если запустить под убунту (сервер) то выдает ошибку. Вот скрипт:

Код

use strict;
use warnings;

use lib ("/bb_projekt/docia/perl/lib");

use DBI;

use Backbone::Sql;
use Docia::Conf;

my $dbh;

# open database handle
if(defined $constants{Database}{DB_TYPE} && $constants{Database}{DB_TYPE} eq "sybase") {
    # open database handle (linux version)
    $dbh = DBI->connect( 'dbi:Sybase:Byggeweb',$constants{Database}{DB_USER}, $constants{Database}{DB_PASSWORD},
        { RaiseError => 0, AutoCommit => 0, syb_chained_txn => 0 })
        || die "Database connection not made: " . DBI->errstr();
    ($dbh->do("use ".$constants{Database}{DB_NAME}) != -2) or die "Cannot switch to Byggeweb";
} else {
    # open database handle (windows version)
    $dbh = DBI->connect("dbi:ODBC:driver={SQL Server};Server=".$constants{Database}{DB_SERVER}.";database=".$constants{Database}{DB_NAME}.";uid=".$constants{Database}{DB_USER}.";pwd=".$constants{Database}{DB_PASSWORD}.";",
        undef,undef,{ RaiseError => 0, AutoCommit => 0 })    or die "Connect to ".$constants{Database}{DB_SERVER}." failed: $DBI::errstr";
    $dbh->{LongReadLen} = 512000;
}

my $name = 'testdata_' . time;
print "Creating a test element '$name'\n";
my $string = "english \x{263a}";

# insert a new element
Backbone::Sql::doQuery($dbh, sql=>"insert into [NameValue] ([Name],[ValueStr]) values (?,?)", args=>[$name, $string]);
$dbh->commit();

# get it back
my ($row) = Backbone::Sql::doQuery($dbh, sql=>"select * from [NameValue] where [Name]=?", args=>[$name]);

# compare
if($string eq $row->{ValueStr}){
    print "Success\n";
}else{
    print "Failed\n";
}


Ошибка под убунтой (возникает при инсерте): 
DBD::Sybase::st execute failed: OpenClient message: LAYER = (0) ORIGIN = (0) SEVERITY = (9) NUMBER = (98) Server Byggeweb, database Byggeweb
Message String: Error converting characters into server's character set. Some character(s) could not be converted

Может кто подскажет как это лечить? Пишите, предоставлю любые нужные конфиги для анализа.

PM MAIL   Вверх
arto
Дата 5.9.2012, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



указать charset?
PM MAIL ICQ   Вверх
infarch
Дата 5.9.2012, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



А где указать то? Подскажите пожалуйста с примером )

PM MAIL   Вверх
arto
Дата 5.9.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



похоже, документацию вы не читали.
perldoc DBD::Sybase
PM MAIL ICQ   Вверх
infarch
Дата 5.9.2012, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



В том то и дело что читал, только вот не получилось у меня так сделать...
Если я писал конект в форме отличной от 'dbi:Sybase:Byggeweb',$constants{Database}{DB_USER}, $constants{Database}{DB_PASSWORD} то получал ошибку. Здесь dbi:Sybase:Byggeweb имя секции конфига FreeTDS. А там и написано как документация говорит: client charset = UTF-8


PM MAIL   Вверх
arto
Дата 5.9.2012, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# LC_ALL=en_GB.UTF-8 SYBASE=/opt/sybase perl -MDBI -MDBD::Sybase -le '$dbi = DBI->connect(@ARGV[0,1,2]) or die $DBI::errstr; $dbi->do("insert into test(name) values (''$ARGV[3]'')")' "dbi:Sybase:server=A;database=pubs3;charset=utf8" "sa" "pass" "В том то и дело что читал"
# sqsh -S A -U sa -P pass -p -Dpubs3 -C "select * from test;"     15:41 (0)
...
 name                                                                            
 --------------------------------------------------------------------------------
 test                                                                            
 В том то и дело что читал                                    

(2 rows affected)
Clock Time (sec.): Total = 0.001  Avg = 0.001 (915.75 xacts per sec.)
#

Это сообщение отредактировал(а) arto - 5.9.2012, 15:43
PM MAIL ICQ   Вверх
infarch
Дата 5.9.2012, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Ваши однострочники - сами по себе песня ) Спасибо, в таком варианте удалось установить связь с базой и не свалиться с ошибкой:

Код

my $dbh = DBI->connect('dbi:Sybase:server=Byggeweb;database=Byggeweb;charset=utf8',
$constants{Database}{DB_USER}, $constants{Database}{DB_PASSWORD},
 { RaiseError => 0, AutoCommit => 0,syb_chained_txn => 0 }));


Однако ошибка осталась на месте: 
DBD::Sybase::st execute failed: OpenClient message: LAYER = (0) ORIGIN = (0) SEVERITY = (9) NUMBER = (98) Server Byggeweb, database Byggeweb
Message String: Error converting characters into server's character set. Some character(s) could not be converted


Позвольте спросить: что означает вот это # LC_ALL=en_GB.UTF-8 SYBASE=/opt/sybase ? Поясните пожалуйста человеку практически не знакомому с линуксом. Может тут у меня проблема?
PM MAIL   Вверх
arto
Дата 5.9.2012, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



это переменные окружения.
а какой charset у таблицы стоит?
и какую строку вы пытаетесь запихнуть? у нее utf8 флаг стоит?
PM MAIL ICQ   Вверх
infarch
Дата 6.9.2012, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



test-deployer@linux-bw-test:~$ locale
LANG=en_DK.UTF-8
LC_CTYPE="en_DK.UTF-8"
LC_NUMERIC="en_DK.UTF-8"
LC_TIME="en_DK.UTF-8"
LC_COLLATE="en_DK.UTF-8"
LC_MONETARY="en_DK.UTF-8"
LC_MESSAGES="en_DK.UTF-8"
LC_PAPER="en_DK.UTF-8"
LC_NAME="en_DK.UTF-8"
LC_ADDRESS="en_DK.UTF-8"
LC_TELEPHONE="en_DK.UTF-8"
LC_MEASUREMENT="en_DK.UTF-8"
LC_IDENTIFICATION="en_DK.UTF-8"
LC_ALL=

Засовываю в таблицу я вот это: my $string = "english \x{263a}";
Не знаю стоит ли там флаг, честно говоря я в этом перловом юникоде не силен. Подскажете как глянуть?

Чарсет таблицы - что это? Колейшен базы данных SQL_Danish_Pref_CP1_CI_AS. Надо поменять? На какой? Поля в таблице nvarchar.

PM MAIL   Вверх
arto
Дата 6.9.2012, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



у вас en_DK.utf8 в locales.dat есть?

попробуйте поставить use utf8.
PM MAIL ICQ   Вверх
infarch
Дата 6.9.2012, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Подскажите, где искать этот locales.dat ? В папке freetds есть файл locales.conf, там прописано:

[en_DK]
        date format = %b %d %Y %I:%M%p
        language = us_english
        char set = utf8

use utf8 поставил, не помогло.
PM MAIL   Вверх
arto
Дата 6.9.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



на сервере, $SYBASE/locales/locales.dat

попробуйте установить флаг utf8 у строки и проверить его наличие (perldoc utf8)
PM MAIL ICQ   Вверх
infarch
Дата 6.9.2012, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



echo $SYBASE вернул мне пустую строку. И судя по тому что мне попалось из информации, ставить его надо так: export SYBASE=/usr/local/freetds, указав куда поставлен фритдс. в той папке у меня locales.dat нет, только locales.conf

is_utf говорит что флаг выставлен
PM MAIL   Вверх
arto
Дата 6.9.2012, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



freetds -- это клиент.
вам надо смотреть на сервер, где вертится ваша база данных.
PM MAIL ICQ   Вверх
infarch
Дата 6.9.2012, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



База данных на виндовс машине. А что там смотреть то?
PM MAIL   Вверх
arto
Дата 6.9.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



с windows я не работал.
PM MAIL ICQ   Вверх
infarch
Дата 7.9.2012, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Я склоняюсь к тому что проблема не сервере базы данных. Мне таки удалось передать юникод с линукса в базу. Однако скрипт запускался апачем и принимал данные из CGI. Далее, я использовал не плейсхолдеры, а прямой запрос. Вот так:

Код

my $string = $cgi->param("string");
my $sql = "insert into table (somefield) values (N'$string')";
...


B таком варианте я получил в базе корректные данные. Если же я использовал плейсхолдеры то картина иная. Вот такой вот скрипт:

Код

my $string = $cgi->param("string");
my $sql = "insert into table (somefield) values (?)";
my $sth = $dbh->prepare($sql);
$sth->execute($string);
$sth->finish();
$dbh->commit();


При вставке строки из цифр и английских символов все хорошо. Если же субмитнуть еще и русские и прочие юникодные символы то вставляется пустое значение. Прямое указание типа при байнде ничего не изменило:

Код

$sth->bind_param(1, $string,  {TYPE => SQL_WVARCHAR});
$sth->execute();


Однако мне очень нужны плейсхолдеры, это ключевой момент в проекте. И поэтому я буду крайне благодарен за помощь.

Еще один момент... Я пробовал связаться с базой используя unixODBC и драйвер для sql server от EasySoft. Плейсхолдеры заработали, но кричать Ура рано: во-первых там надо указывать тип данных, причем всегда ("$sth->bind_param(1, $string,  {TYPE => SQL_WVARCHAR});"), во-вторых драйвер платный и нужная лицензия потянет евро так на 5000. Так что фритдс и сибейс крайне желательны.

Это сообщение отредактировал(а) infarch - 7.9.2012, 12:09
PM MAIL   Вверх
arto
Дата 7.9.2012, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# LC_ALL=en_GB.UTF-8 SYBASE=/opt/sybase perl -CSA -MDBI -MDBD::Sybase -le '$dbi = DBI->connect(@ARGV[0,1,2]) or die $DBI::errstr; $sth = $dbi->prepare("insert into test(name) values (?)") or die $dbh->errstr; $sth->execute($ARGV[3]);' "dbi:Sybase:server=A;database=pubs3;charset=utf8" "sa" "pass" "В том то и дело что читал + 1"
# sqsh -S A -U sa -P pass -p -Dpubs3 -C "select * from test;"
...
 name                                                                            
 --------------------------------------------------------------------------------
 test                                                                            
 В том то и дело что читал                                    
 В том то и дело что читал + 1                                

(3 rows affected)
Clock Time (sec.): Total = 0.001  Avg = 0.001 (895.26 xacts per sec.)
# ldd /usr/local/lib/perl/5.12.4/auto/DBD/Sybase/Sybase.so
        linux-vdso.so.1 =>  (0x00007fff64b59000)
        libsybct64.so => /opt/sybase/OCS-15_0/lib/libsybct64.so (0x00002b8d985d0000)
        libsybcs64.so => /opt/sybase/OCS-15_0/lib/libsybcs64.so (0x00002b8d98868000)
        libsybblk64.so => /opt/sybase/OCS-15_0/lib/libsybblk64.so (0x00002b8d98a7c000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00002b8d98cbe000)
        libsybtcl64.so => /opt/sybase/OCS-15_0/lib/libsybtcl64.so (0x00002b8d9905f000)
        libsybcomn64.so => /opt/sybase/OCS-15_0/lib/libsybcomn64.so (0x00002b8d99287000)
        libsybintl64.so => /opt/sybase/OCS-15_0/lib/libsybintl64.so (0x00002b8d99545000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00002b8d9974e000)
        libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00002b8d99953000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00002b8d99b6d000)
        libsybunic64.so => /opt/sybase/OCS-15_0/lib/libsybunic64.so (0x00002b8d99df1000)
        /lib64/ld-linux-x86-64.so.2 (0x00002b8d9818a000)
#

Как видно работает.
Правда DBD слинкован с оригинальными библиотеками, не с TDS.

Попробуйте выставить LC_ALL как у меня, если не заработает, попробуйте взять с sybase.com библиотеки.
PM MAIL ICQ   Вверх
infarch
Дата 7.9.2012, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Выставил LC_ALL, ничего не изменилось.

test-deployer@linux-bw-test:/usr/local/lib/perl/5.8.8/auto/DBD/Sybase$ ldd Sybase.so
        libct.so.4 => /usr/local/freetds/lib/libct.so.4 (0x00002ac5ff4f5000)
        libtds.so.5 => /usr/local/freetds/lib/libtds.so.5 (0x00002ac5ff749000)
        libdl.so.2 => /lib/libdl.so.2 (0x00002ac5ff98c000)
        libm.so.6 => /lib/libm.so.6 (0x00002ac5ffb90000)
        libc.so.6 => /lib/libc.so.6 (0x00002ac5ffe12000)
        librt.so.1 => /lib/librt.so.1 (0x00002ac600164000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00002ac60036d000)
        /lib64/ld-linux-x86-64.so.2 (0x0000555555554000)

Вам это о чем либо говорит? На сибейсе вообще непонятно где качать либы ( Можете дать ссылку?
PM MAIL   Вверх
arto
Дата 7.9.2012, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



у вас слинковано с FreeTDS.

ASE for Linux смотреть здесь: http://response.sybase.com/forms/ASE_Linux_Download
Я не помню, поставляют они библиотеки для клиента отдельно, или нет.
PM MAIL ICQ   Вверх
arto
Дата 7.9.2012, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



btw, вы читали README.freetds из DBD::Sybase?

Missing Features:
-----------------

* ?-style placeholders are not supported.
* Setting $dbh->{LongReadLen} doesn't work
  Use $dbh->do("set textsize <value>") instead.
* The special text/image handling functions don't work
  (i.e. ct_fetch_data(), etc).
* The $dbh->{syb_row_count} attribute doesn't work.
  Use $dbh->do("set rowcount <value>") instead.
* The $dbh->{syb_quoted_identifier} attribute doesn't work.
  Use $dbh->do("set quoted_identifier <value>") instead.

PM MAIL ICQ   Вверх
infarch
Дата 7.9.2012, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Боюсь я что клиент не захочет ставить еще и это :( 800 метров, явно не только либы там лежат... Кстати, гляньте вот на это: http://www.nntp.perl.org/group/perl.dbi.us...0/msg34271.html
Вы не знаеет о чем там речь? Что это за unixODBC/CVS + FreeTDS/CVS?

Добавлено через 2 минуты и 36 секунд
Цитата(arto @ 7.9.2012,  15:37)
btw, вы читали README.freetds из DBD::Sybase?

Missing Features:
-----------------

* ?-style placeholders are not supported.

Не читал... Действительно, намек прозрачный. Но ведь они таки работают! Только с юникодом проблема, а так то все в порядке.
PM MAIL   Вверх
arto
Дата 7.9.2012, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



вы какую версию протокола поставили в freetds.conf?
и какую поддерживает ваш сервер?

у меня на сервере ASE 15.7.0, прописал tds version = 5.0, и отработало
perl -Mblib -CSA -MDBI -MDBD::Sybase -le '$dbi = DBI->connect(@ARGV[0,1,2]) or die $DBI::errstr; $sth = $dbi->prepare("insert into test(name) values (?)") or die $dbh->errstr; $sth->execute($ARGV[3]);' "dbi:Sybase:server=A;charset=utf8;database=pubs3"

PM MAIL ICQ   Вверх
urbano
Дата 8.9.2012, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.3.2012

Репутация: нет
Всего: нет



в Дойч банк'е программируете?

они там поддерживает одну систему на perl и она через 1 год само уничтожиться
весь проект на разных языках
PM MAIL WWW   Вверх
arto
Дата 8.9.2012, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



это кому вопрос?
PM MAIL ICQ   Вверх
infarch
Дата 10.9.2012, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Я не в Дойч, но система на перл, жава, сишарп... Уже лет 10 как живет, и умирать пока не собирается
PM MAIL   Вверх
infarch
Дата 11.9.2012, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Кстати, я вот еще что заметил: сибейс не возвращает мне юникодные строки с выставленным флагом ютф.

Код

my $dbh = DBI->connect('dbi:Sybase:server=Byggeweb;database=Byggeweb;charset=utf8',$constants{Database}{DB_USER},
        $constants{Database}{DB_PASSWORD}, { RaiseError => 0, AutoCommit => 0, syb_chained_txn => 0, syb_enable_utf8=>1 })|| die 'aaaaa';

my ($row) = Backbone::Sql::doQuery($dbh, sql=>"select * from [Directory] where ID=9908");
my $str = $row->{Name};
my $isutf = utf8::is_utf8($str) ? 1 : 0;
print "($isutf) $str\n";


На проверке получаю ноль, хотя выставил и charset=utf8, и syb_enable_utf8=>1. А если под виндой, через ODBC, то выставляет флаг коректно. Не подскажете как это вылечить?
PM MAIL   Вверх
arto
Дата 11.9.2012, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# perl -Mutf8 -Mblib -CSA -MDBI -MDBD::Sybase -le '$dbi = DBI->connect(@ARGV[0,1,2]) or die $DBI::errstr; $sth = $dbi->prepare("select * from test") or die $dbh->errstr; $sth->execute(); while (my ( $a ) = $sth->fetchrow) { utf8::decode($a); print $a }' "dbi:Sybase:server=A;charset=utf8;database=pubs3" "sa" "pass" 
test
В том то и дело что читал
В том то и дело что читал + 1

PM MAIL ICQ   Вверх
infarch
Дата 11.9.2012, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Вы используете decode... Следует ли это понимать так что вы тоже получаете строки без флага? Так я как раз и хочу это исправить... Или о чем вы хотели сказать?
PM MAIL   Вверх
infarch
Дата 13.9.2012, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



В общем я понял что с сибейс каши не сваришь... И в результате переехал на DBD::ODBC. Использую UnixODBC и FreeTDS как драйвер. И все заработало. Закрываю тему.
PM MAIL   Вверх
arto
Дата 13.9.2012, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



это freetds не понимает utf8, с openclient нормально.
декодируйте полученый контент.
PM MAIL ICQ   Вверх
infarch
Дата 13.9.2012, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



Да не хочу я ничего декодировать. Мне нужно чтобы я вообще не думал на какой платформе работает сайт. Конекшен к базе я делаю в одном единственном модуле, там я еще могу проверить окружение и создать датабейс хендлер по вкусу. Дальше уже все усложняется, выборки и вставки бывают самые разные и в неожиданных местах. Я не буду вставлять декод в сотне модулей. Так что после некоего терморектального воздействия на клиента мы решили перейти на одбц везде. Это еще больше нас приближает к стандартизации работы с базой. Заодно и на новый линукс переехали )

Это сообщение отредактировал(а) infarch - 13.9.2012, 17:18
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.6149 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.