URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2838
[ Назад ]

Исходное сообщение
"Perl + BLOB в MySQL"

Отправлено Osirix , 24-Апр-04 13:28 
Есть задача.
Нужно писать двоичные данные в BLOB поля базы MySQL. Данные берутся из файлана диске.
Сложность заключается в том, что двоичные данные перед их вставкой в SQL запрос к базе данных должны специальным образом обрабатываться (это как я понял заменяться символы кавычек, переносов каретки, итд...).
В инетрнете инфа по этому крайне скудная, но описывается 3 способа.
1. Цитата  
SELECT QUOTE("$jpg")
, где $jpg это переменная с бинарными данными, а потом результаты этого запроса вставляем в запрос с занесением данных. Ну или может как-то попроще но суть такова что свма БД готовид данные для занесения в БЛОБ.
2.
Цитата  

my $sql = "UPDATE `m_snif` SET pic1=? WHERE id=$id";

   my $sth = $db->prepare($sql) or do {
       die "It didn't work. [$DBI::errstr]\n";
   };
   $sth->bind_param(1, $jpg);

   $sth->execute or do {
       die "It didn't work. [$DBI::errstr]\n";
   };

Так называемый способ bind_param после prepare.

и
3. это просто самому заменять спец символы через регулярные выражения
Цитата  

$jpg =~ s///g;
$jpg =~ s/00//g;
$jpg =~ s/'/'/g;
$jpg =~ s/"/"/g;
$jpg =~ s/\t/\\t/g;
$jpg =~ s/\n/\\n/g;
$jpg =~ s/\r/\\r/g;
$jpg =~ s/\b/\\b/g;
$jpg =~ s/\0/\\0/g;

Это конечно все очень замечательно, что так много способов существует. Но они все не работают!!!
Помогите! Как? Может кто делал?

Да к стати. Чтение из файла происходит вот так:
Исходный код  

open    JPG, "</usr/home/Osirix/pics/00000001.jpg" or die "$!";
       binmode (JPG); # Только ли в Windows нужа эта строка?
       $jpg = <JPG>;
       close   JPG;

Ну и сответственно все это крутится не под виндами, а под Фрей.


Содержание

Сообщения в этом обсуждении
"Perl + BLOB в MySQL"
Отправлено Асен Тотин , 24-Апр-04 22:52 
Привет,

Занесение картинок в БД - само по себе неправильно. Суть БД состоит в том, чтобы иметь мссив данных, в котором можно вести поиски. Вески (смысленный) поиск в двоичных данных картинки, конечно, невозможно. На все остальные случаи жизни есть файловая система.

Поэтому если вам нужно связать объект в БД с картинкой, просто занесите в БД путь к этой картинке - сэкономите массу времени и ресурсов.

WWell,


"Perl + BLOB в MySQL"
Отправлено bars , 25-Апр-04 11:50 
>Привет,
>
>Занесение картинок в БД - само по себе неправильно. Суть БД состоит
>в том, чтобы иметь мссив данных, в котором можно вести поиски.
>Вески (смысленный) поиск в двоичных данных картинки, конечно, невозможно. На все
>остальные случаи жизни есть файловая система.
>
>Поэтому если вам нужно связать объект в БД с картинкой, просто занесите
>в БД путь к этой картинке - сэкономите массу времени и
>ресурсов.
Зато удобно сделав дамп базы иметь в нем весь сайт.
Не нужно думать о правах на дирректории куда эти файлы в вашем случае должны будут писаться.
Вообщем в этом тоже что-то есть.


"Perl + BLOB в MySQL"
Отправлено Osirix , 25-Апр-04 16:49 
>Занесение картинок в БД - само по себе неправильно. Суть БД состоит
>в том, чтобы иметь мссив данных, в котором можно вести поиски.
>Вески (смысленный) поиск в двоичных данных картинки, конечно, невозможно. На все
>остальные случаи жизни есть файловая система.
>
>Поэтому если вам нужно связать объект в БД с картинкой, просто занесите
>в БД путь к этой картинке - сэкономите массу времени и
>ресурсов.

Если бы мне этго было не нужно, я бы не спрашивал.
Мне проще держать сотню картинок в БД, чем поднимать лишние сервисы на удаленных серверах что бы апач смог до них добраться.

К тому же в Mysql специально придуман тип данных BLOB, так почему туда нельзя записать то для чего он предназначен?
Я придумал способ как это обойти. Перекодировать картинки допустим в base64 и запихать их в BLOB как текстовую информацию, но мне это решение не нравится, в подобном случае я могу их и в TEXT запихать...
Чушь какая-то...


"Perl + BLOB в MySQL"
Отправлено Osirix , 25-Апр-04 20:21 
Все я сам разобрался. =)
Вся проблема была ы считывании из файла в переменную.
Надо делать вот так:
open    JPG, "</usr/home/Osirix/pics/00000001.jpg" or die "$!";
$doc_len = read JPG, $jpg, 999999;
close   JPG;

ну и потом:
$sth=$db->prepare("UPDATE `m_snif` SET pic1=? WHERE id = $id") || die "$dbh->errstr\n";
$sth->execute($jpg) || die "$sth->errstr\n";


"Perl + BLOB в MySQL"
Отправлено alchie , 26-Апр-04 03:48 
>Все я сам разобрался. =)
>Вся проблема была ы считывании из файла в переменную.
>Надо делать вот так:
>open    JPG, "</usr>$doc_len = read JPG, $jpg, 999999;
>close   JPG;
>
>ну и потом:
>$sth=$db->prepare("UPDATE `m_snif` SET pic1=? WHERE id = $id") || die "$dbh->errstr\n";
>$sth->execute($jpg) || die "$sth->errstr\n";

$qjpg = $dbh->quote($jpg);
$dbh->do("UPDATE m_snif SET pic=$qjpg WHERE id=$id")