Как использовать LOAD_FILE для загрузки файла в BLOB-объект MySQL? - PullRequest
9 голосов
/ 22 ноября 2011

Я попытался загрузить файл в BLOB-объект MySQL (на Mac).

Мой запрос:

INSERT INTO MyTable VALUES('7', LOAD_FILE('Dev:MonDoc.odt'))

Ошибка не появляется, но файл не загружен в BLOB-объект.

Ответы [ 5 ]

9 голосов
/ 22 ноября 2011

В руководстве указано следующее:

LOAD_FILE (имя_файла)

Считывает файл и возвращает содержимое файла в виде строки.Чтобы использовать эту функцию, файл должен находиться на хосте сервера, необходимо указать полный путь к файлу и иметь привилегию FILE.Файл должен быть доступен для чтения всем, и его размер должен быть меньше max_allowed_packet байтов.Если для системной переменной secure_file_priv задано непустое имя каталога, загружаемый файл должен находиться в этом каталоге.

Если файл не существует или не может быть прочитан из-за того, что одно из предыдущих условий не выполняется, функция возвращает NULL.

Начиная с MySQL 5.0.19, системная переменная character_set_filesystem управляет интерпретацией имен файлов, представленных в виде буквенных строк.

mysql> UPDATE t
            SET blob_col=LOAD_FILE('/tmp/picture')
            WHERE id=1;

Отсюда,Я вижу более одной вещи, которая может быть неправильной в вашем случае ...

  • вы проходите полный путь?
  • правильно ли установлены привилегии?
  • чтофункция возвращает?NULL?
  • пробовали ли вы выполнить запрос, указанный в руководстве?
4 голосов
/ 15 апреля 2013

У меня была такая же проблема с Linux ...

select load_file('/tmp/data.blob');
+-----------------------------+
| load_file('/tmp/data.blob') |
+-----------------------------+
| NULL                        |
+-----------------------------+

В конце концов я мог успешно загрузить файл после того, как владение пользователя и группы было изменено на «mysql»:

sudo chown mysql:mysql /tmp/data.blob
3 голосов
/ 24 декабря 2014

Я просто хотел добавить еще одно предупреждение, которое я нашел в своем тестировании:

при использовании select load_file('/path/to/theFile.txt'); Файл, который вы загружаете ДОЛЖЕН быть на компьютере, на котором работает экземпляр sql.

Это надолго застало меня врасплох, потому что я использую MySQL, чтобы постоянно загружать файлы в наши различные экземпляры sql, а при использовании таких команд, как LOAD DATA LOCAL INFILE 'C:/path/to/theFile.csv' INTO TABLE, они легко могли бы получить файлс моего локального жесткого диска и обработать его в таблицы независимо от того, где был запущен фактический экземпляр SQL.Однако команда load_file, по-видимому, ведет себя по крайней мере не так (возможно, существует команда local_load_file (), о которой я не знаю).Похоже, что MySQL позволяет только искать файлы из локальной системы, в которой работает экземпляр sql.

Так что, если вы похожи на меня и не можете понять, почему load_file всегда возвращает NULL, не бойтесь... загрузите файлы на экземпляр сервера sql, а затем используйте этот путь в браузере запросов, и все будет хорошо.

2 голосов
/ 25 октября 2013

двойная экранизация слешей на полном пути, если вы находитесь в windows.

1 голос
/ 10 ноября 2015

Спасибо.

Пользователь, который запускает mysql, должен СОБСТВЕННО файл. Моя ошибка заключалась в том, что я думал, что нужно просто прочитать или выполнить файл.

...