Разработка сайтов и программного обеспечения, системное администрирование, обучение программированию и работе с СУБД MySQL

in english

Загрузка большого файла (1 Mb) в Blob-поле

Главная Статьи Загрузка большого файла (1 Mb) в Blob-поле

Совсем недавно, при написании небольшой программы на Perl, возникла проблема при загрузке файлов размером более 1 Mb в blob поле СУБД MySQL. При этом использовался интерфейс Perl DBI.

После продолжительного гугления я так ничего не обнаружил. Стал читать маны и вот до чего дочитался:

По умолчанию размер запроса ограничен и зависит от переменной max_allowed_packet и составляет 16777216 байт.

Посмотреть значение можно командой SHOW VARIABLES();. На эту команду я получаю ответ:

+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------|
| back_log                        | 50                           |
.... 
| max_allowed_packet              | 1047552                      |
...
 

 

Попытка установить это значение на лету (через SET...) ни к чему хорошему не привела, про что в мануале сказано значение переменной должно быть установлено при запуске сервера.

А еще там написано про то, что по умолчанию ее значение 16777216 байт, а это совсем не то значение, которое у меня.

После недолгой правки my.ini, в нем появилась строчка

[mysqld]
set-variable = max_allowed_packet=16M

На этом все проблемы закончились. Если хотите вставлять файл больше 16 Mb, то, соответственно, увеличивайте размер пакета.

Вот выдержка из мануала: max_allowed_packet Максимальный размер одного пакета. Изначально размер буфера сообщений устанавливается в net_buffer_length байтов, но при необходимости может возрасти до max_allowed_packet байтов. Это значение по умолчанию не настолько велико, чтобы отсеивать большие (возможно ошибочные) пакеты. Если используются большие столбцы BLOB, его необходимо увеличить. Значение должно быть не меньше самого большого BLOB, который будет использоваться. Ограничение протокола для max_allowed_packet составляет 16 Мб в MySQL 3.23 и 1Гб в MySQL 4.0.

Реклама:

Метки: MySQL, blob, max_allowed_packet, perl, DBI, сисадмину.

Комментарии:

Evgeniy:
Команда SHOW VARIABLES пишется без скобок
Наки:
Ограничение протокола для max_allowed_packet составляет 16 Мб в MySQL 3.23. т.е не по умолчанию, а максимальный размер 16мб. А по умолчанию стоит 1мб
zoonman:
Наки, вы безусловно правы. 16 mb это ограничение сверху.
Начиная с версии 5.6.6 значение по умолчанию 4 Mb.
Сергей:
Интересно, сколько места занимает файл jpg весом в 1Мб в БД?
zoonman:
У меня не было точно 1MB фото, но было 1.2.
Я создал новую таблицу, добавил в нее таблицу с двумя полями - id и blob. После вставки записи в первый раз база занимала 2.0MB, потом я добавил еще одну такую же и база выросла до 9.0MB, из чего я сделал вывод, что MySQL использует алгоритм предварительного выделения дополнительного места для будущих изображений.

В общем идея хранения файлов в БД не самая лучшая, но имеет смысл тогда, когда вынесение данных в отдельный файл критично. Например в случае хранения документов в системе документооброта или фотографий сотрудников в системах контроля доступа.
имя:

e-mail (не публикуется):

комментарий:

© Ткачев Филипп, 2005—2017
Программист, веб-разработка и прикладное ПО.
Все права защищены.