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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вставка юникодных символов в базу 
V
    Опции темы
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   Вверх
Страницы: (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.0838 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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