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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как работать в БД с типом LongBlob 
:(
    Опции темы
DEER
Дата 21.11.2005, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

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



у меня у одного поля в БД(MySQL 5) тип LONGBLOB, не могу получить, то что там записано smile
т.е. запрос а выборку срабатывает нормально, но потом, когда пытаюсь получить значение из этого поля, например в $res, ничего не возвращается smile
Как это лечиться?


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
korob2001
Дата 21.11.2005, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Покажи пример того, как ты пытаешься это сделать.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
DEER
Дата 21.11.2005, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

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



Код

my $res;
my $sth = $dbh->prepare("SELECT pdump.dump FROM pdump WHERE pdump.id = '1' ");
  $sth->execute();
  if (my $ref = $sth->fetchrow_hashref()) {
    $res = $ref->{'dump'};
    print "Dump : $res";
  }
  $sth->finish();

pdump.dump имеет тип LONGBLOB
этот код выводит
Цитата
Dump :

и всё, т.е. запись то отбирается, но значение не возвращается

Это сообщение отредактировал(а) DEER - 21.11.2005, 11:00


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 21.11.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



DEER
Попробуй посмотреть, что в переменной находится:
Код

use Data::Dumper;
if (my $ref = $sth->fetchrow_hashref()) {
 print Dumper($ref);
}


Зачем ты в запросе указываешь таблицу перед полем? Ты же работаешь с одной таблицей.
В этом может быть и ошибка. Раз ты используешь хеши при выборке, то забирай все поля.
Код

"SELECT * FROM pdump WHERE id = '1'"


И используй fetchrow в цикле для получения всех записей или вообще используй selectrow_hashref.

smile

Это сообщение отредактировал(а) sharq - 21.11.2005, 12:00


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
DEER
Дата 21.11.2005, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

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



Цитата(sharq @ 21.11.2005, 11:53)
DEER
Попробуй посмотреть, что в переменной находится:
Код

use Data::Dumper;
if (my $ref = $sth->fetchrow_hashref()) {
 print Dumper($ref);
}


Спасибо, попробую
Цитата(sharq @ 21.11.2005, 11:53)

Зачем ты в запросе указываешь таблицу перед полем? Ты же работаешь с одной таблицей.
В этом может быть и ошибка. Раз ты используешь хеши при выборке, то забирай все поля.
Код

"SELECT * FROM pdump WHERE id = '1'"


И используй fetchrow в цикле для получения всех записей или вообще используй selectrow_hashref.

smile

ВОт если запрос сделать так

Код

my $res;    
my $sth = $dbh->prepare("SELECT pdump.id FROM pdump WHERE pdump.id = '1' ");    
  $sth->execute();    
  if (my $ref = $sth->fetchrow_hashref()) {    
    $res = $ref->{'id'};    
    print "Dump : $res";    
  }    
  $sth->finish();

он возвращает "1", т.е. ошибки нет, это я проверял.... просто мне кажется что этот LONGBLOB надо получать каким то иным способом.... smile


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
DEER
Дата 21.11.2005, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

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



Может не в кассу, но в JAVA есть метод дла получения бинарных данных
Код

res.getBytes(1);

где res - результат запроса, что то подобное моему $ref
вот что нить подобного нету в Perl?


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
sharq
Дата 21.11.2005, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



DEER perldoc DBI - LongReadLen.


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
DEER
Дата 21.11.2005, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

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



не пошло
Цитата
C:\>perldoc DBI - LongReadLen
No documentation found for "-".
No documentation found for "LongReadLen".
NAME
    DBI - Database independent interface for Perl

SYNOPSIS
      use DBI;
------- - --- - - - -------------

Добавлено @ 13:45
Поясни плиз
Цитата
The "LongReadLen" attribute may be used to control the maximum
length of 'long' type fields (LONG, BLOB, CLOB, MEMO, etc.) which
the driver will read from the database automatically when it fetches
each row of data.

он может быть использован для контроля длины поля??? Так что ли?


а в этом коде что происхдит? он сначала "подготавливается" для того чтобы можно было получать данные из Blob'а что ли?
Код

  $dbh->{LongReadLen} = $dbh->selectrow_array(qq{
      SELECT MAX(OCTET_LENGTH(long_column_name))
      FROM table WHERE ...
  });
  $sth = $dbh->prepare(qq{
      SELECT long_column_name, ... FROM table WHERE ...
  });



--------------------
 
PM MAIL WWW ICQ MSN   Вверх
DEER
Дата 21.11.2005, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

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



Всё! по ходу понял!

Короче этот LongReadLen отвечает за максимальную длину выбираемых полей, по умолчанию он стоит в "0", что означает что длинные поля скорее всего не будут выбираться.
Для выбора этих полей сначала надо произвести изменение этого аттрибута
Код

$dbh->{LongReadLen} = $dbh->selectrow_array(qq{    
      SELECT MAX(OCTET_LENGTH(dump))    
      FROM pdump WHERE id = '1'
  });

и потом уже можно делать выборку из БД
Код

$sth = $dbh->prepare(qq{    
      SELECT ldump FROM pdump WHERE id = '1'    
  });

по идее должно заработать.

Правильно?

Это сообщение отредактировал(а) DEER - 21.11.2005, 14:10


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
korob2001
Дата 21.11.2005, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Цитата

по идее должно заработать.

Правильно?

smile А почему ты не попробуешь? Хотя я вообще не пойму смысла хранения двоичных данных в базе данных. Может стоит подумать над тем, что бы их хранить отдельно, а в базу писать только ссылку?


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
DEER
Дата 22.11.2005, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

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



Всё работает!!! Даже очень!!!

sharq Спасиба за ссылку!

korob2001Это не моя пререгатива, базу мне готовую дали smile


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
Kiber_rat
Дата 28.11.2005, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



korob2001 Если хранить в базе ссылку на данные хранящиеся где-то в файлах то это нарушает целостность хранения данных и усложняет возможности для их архивироваия. С этой точки зрения хранение в базе двоичных данных - меньшее из зол. Я иногда использую хранение сериализованных данных в базе, что бы потом их можно было легко превратитьв структуру (хэш например), это тоже оправдывает хранение двоичных данных в базе.


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
korob2001
Дата 29.11.2005, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Да всё это понятно, но не дорого ли эта база будет обходиться, если в ней хранить изображения, mp3, flash файлы и т.п.?


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Kiber_rat
Дата 29.11.2005, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

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



Во всам важно чувство меры smile Кроме того это сильно зависит от массы факторов, начиная от предпологиемой пиковой посещаемости ресурса и заканчивая уже упомянутой необходимостью бэкапа (критичностью информации).


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
alSteve
Дата 15.4.2008, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго дня!

Помогите пожалуйста разобраться в проблеме!
Есть код:
Код

$dbh->{LongReadLen} = $dbh->selectrow_array(qq{    
      SELECT MAX(OCTET_LENGTH(text))    
      FROM out_mail WHERE row_id = '156'});

$sth = $dbh -> prepare("SELECT  text from out_mail where row_id = 156"); 
$sth -> execute(); 
$file = $sth -> fetchrow_array(); 

print "Content-type: application/x-force-download\n";
print "Content-Disposition: attachment; filename=\"test.zip\"\n";
print "\n";
print $file;


в поле TEXT типа LONGBLOB (MySQL5) хранится zip-архив.
исходный размер архива 6714 байт. после выполнения вышеуказанного скрипта сохраняется файл test.zip размером 6732 байта и соответственно архив некорректный. Распаковать его не представляется возможным. 
Где моя ошибка?  :dash1 

Заранее благодарен!
PM MAIL   Вверх
yura_nev
Дата 16.4.2008, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



после
Код
print "\n";
вставьте строку
Код
binmode STDOUT;

PM MAIL   Вверх
amg
Дата 16.4.2008, 08:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Да, должно помочь, если в базе файл нормальный. Чтобы в этом убедится, посмотрите его размер сразу после извлечения из базы:
Код

use bytes;
print length($file), "\n";

PM MAIL   Вверх
alSteve
Дата 18.4.2008, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(yura_nev @ 16.4.2008,  08:08)
после
Код
print "\n";
вставьте строку
Код
binmode STDOUT;

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


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

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


 




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


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

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