3) Проверить:

я есть таблица с данными изображения, хранящиеся в поле BLOB-объектов в базе данных MySQL. Есть ли способ экспортировать эти изображения в файлы в файловой системе, используя только SQL? Изображения должны называться {imageId} .jpg

Я знаю, что это легко сделать с помощью Java или чего-то еще, но возможно ли это только с помощью сценария SQL?

 suicide10 янв. 2011 г., 13:12
Конечно, но возможно ли это? Потому что я не видел команду SQL для доступа к fielsystem
 Stefan Steiger10 янв. 2011 г., 13:03
Вероятно, это зависит от того, имеет ли пользователь MySQL доступ к файловой системе или нет.

Ответы на вопрос(2)

Решение Вопроса

Мне не нравится идея ...

drop procedure if exists dump_image;
delimiter //
  create procedure dump_image()
  begin

    declare this_id int;
    declare cur1 cursor for select imageId from image;
    open cur1;
      read_loop: loop
        fetch cur1 into this_id;
        set @query = concat('select blob_field from image where imageId=', 
            this_id, ' into outfile "/tmp/xyz-', this_id,'.jpg"');
        prepare write_file from @query;
        execute write_file;
      end loop;
    close cur1;
  end //
delimiter ;

Несмотря на ошибку

mysql> call dump_image();
ERROR 1329 (02000): No data - zero rows fetched, selected, or processed
ls -1 /tmp/xyz*
 lepe23 авг. 2011 г., 04:41
+1 Очень хороший способ сделать это. Как уже прокомментировал Шон, если изображения не отображаются после использования этой процедуры, используйте «dumpfile» вместо «outfile».
 ajreal10 янв. 2011 г., 14:02
используя курсорfetch cur1 into this_id;
 Shaun Hare10 янв. 2011 г., 14:11
Согласитесь, сама идея мне не нравится, вы должны быть очень осторожны с безопасностью и т. Д. Но гибкое решение - выходной файл, а не дамп-файл, привел к повреждению файла для меня
 Marc B10 янв. 2011 г., 13:50
Где вы установилиthis_id? Вы ничего не передали, и это не задано в процедуре, поэтому запрос не будет выполнен. В противном случае это выглядит так, как будто это сработает
 David Tonhofer16 окт. 2018 г., 14:26
Сервер должен работать без опции «secure-file-priv»:The MySQL server is running with the --secure-file-priv option so it cannot execute this statement, Кроме того, в соответствии с описаниемВЫБРАТЬ ... В Синтаксисключевое словоOUTFILE добавит форматирование, в отличие отDUMPFILEтак что пользуйтесь последним.

что у вас есть разрешение на запись в качествеmysql Пользователь в месте, где вы хотите хранить файлы, вы можете сделать:

Select id,blob into dumpfile '/tmp/path' from table;

К сожалению, в MySQL невозможно указать дамп-файл как выражение / переменную. Тем не менее, вы могли бы достичь этого, если бы обернули его в хранимую процедуру и использовали переменные.

 David Tonhofer16 окт. 2018 г., 15:46
Если вы работаете в Unix и имеетеperl а такжеxxd и просто нужно извлечь одну "ячейку", сделайте это: 1) Извлеките ее в формате hexdump:echo "SELECT cell FROM stuff WHERE id = '5656'" | mysql -b -u root -p muhdatabase > OUT.raw 2) Извлечь шестнадцатеричную строку и преобразовать в двоичную форму:cat OUT.raw | perl -n -e 'if (/^0x([0-9A-F]+)$/) { print $1 }' | xxd -r -p > OUT.bin 3) Проверить:file OUT.bin
 Boris Pavlović11 июн. 2013 г., 18:26
Кажется, используяdumpfile вместоoutfile помогает с сериализованными объектами Java.
 rasputino25 февр. 2016 г., 13:44
Вы правы, похоже, что DUMPFILE работает лучше, чем outfile

Ваш ответ на вопрос