Вставка большого двоичного объекта в базу данных MySQL только вставляет NULL - PullRequest
2 голосов
/ 07 мая 2019

Я пытаюсь вставить BLOB-объект с локального диска (Windows 10) в мою базу данных RDS MySQL.Однако мой запрос не вставляет блоб.В новой строке есть все остальные столбцы, но BLOB-объект равен NULL.

INSERT INTO table VALUES('c1', LOAD_FILE('C:/testing.7z'));

Вот что я попробовал:

  • Я установил разрешение файла ro на чтение / запись.
  • secure_file_priv имеет значение / tmp ... Я не знаю, что это значит.Это путь или переменная?Если это переменная, я уже пытался загрузить большой двоичный объект из путей из пользовательской / системной переменной «TMP», но безуспешно.Я не могу изменить secure_file_priv, потому что RDS разрешает изменения ... Если это путь, то по какому пути я должен загрузить файл?
  • max_allowed_packet установлен по умолчанию (1024-1073741824 байт).Мой файл имеет размер 200 КБ.

Как мне загрузить файл?

РЕДАКТИРОВАТЬ: я пытался сделать то же самое в моей локальной базе данных, и это работало - но только с файлами вкаталог выберите @@ secure_file_priv; .

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Вы вставляете NULL, поскольку файл должен относиться к хосту сервера , а не к компьютеру, на котором был отправлен запрос.

Запросы текст они не являются функциями, поэтому вы не можете выполнить запрос, который читает файл с вашего компьютера и передает его на сервер.

Вы можете прочитать файл на одном из языков, с которыми вы знакомы, иперенесите содержимое файла.

Документация для LOAD_FILE: https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_load-file

Важная выдержка:

Чтобы использовать эту функцию, файл должен быть расположенна сервере необходимо указать полный путь к файлу и иметь привилегию FILE.

0 голосов
/ 07 мая 2019

Согласно документации , файл должен находиться в каталоге, указанном в secure_file_priv.Итак, я предлагаю вам создать каталог c:/mysql-uploads, обновить secure_file_priv, указав туда и поместить файл в этот каталог.Я цитирую документы:

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

ОБНОВЛЕНИЕ

Приведенное выше решение применимо только в том случае, если файл расположен на хосте базы данных.Поскольку вы используете AWS RDS, у вас нет доступа к локальной файловой системе, поэтому вы не можете копировать файлы на хост базы данных независимо от того, какое значение установлено для secure_file_priv.Боюсь, вам придется использовать клиентское приложение, которое будет вставлять содержимое / BLOB-объекты, используя методы на стороне клиента (например, JDBC).

Это можно сделать, создав Connection и PreparedStatementиспользуйте setBinaryStream, чтобы загрузить поток файлов в большой двоичный объект, а затем вызовите executeUpdate.Полный пример:

Connection conn = DriverManager.getConnection(url,username,password);
String updateSQL = "INSERT INTO table VALUES(?,?)"
PreparedStatement pstmt = conn.prepareStatement(updateSQL);
File file = new File(filename);
FileInputStream input = new FileInputStream(file);
pstmt.setString(1, "c1");
pstmt.setBinaryStream(2, input);
pstmt.executeUpdate();
...