Вставить файл в поле SQL и извлечь обратно в файл - PullRequest
3 голосов
/ 17 апреля 2019

Я создал простую таблицу:

SHOW DATABASES;
CREATE DATABASE observe;

USE observe;

CREATE TABLE `see_me` (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
name VARCHAR(20),
food VARCHAR(30),
confirmed CHAR(1), 
signup_date DATE,
file_contents LONGBLOB // or VARBINARY(MAX)
);

и файл с именем t.txt.Как я могу вставить файл в поле file_contents с помощью команд sql и извлечь его аналогичным образом в файл?

Вставка может быть что-то вроде

 INSERT INTO see_me(id, file_contents) 
 SELECT '1', BulkColumn FROM OPENROWSET (BULK '/Users/usr_00/lab/t.txt', SINGLE_BLOB) as ...;

Может кто-нибудь посоветовать?

Ответы [ 3 ]

3 голосов
/ 22 апреля 2019

Вы можете вставить содержимое файла в поле с помощью функции LOAD_FILE. Например:

INSERT INTO see_me (file_contents)
VALUES (LOAD_FILE('/var/lib/mysql-files/myfile.txt'));

или в запросе на обновление

UPDATE see_me
SET file_contents = LOAD_FILE('/var/lib/mysql-files/myfile.txt');

Если вы хотите извлечь содержимое файла в новый файл, вы можете использовать SELECT .. INTO DUMPFILE. Например:

SELECT file_contents INTO DUMPFILE '/var/lib/mysql-files/myfile.txt'
FROM see_me
WHERE id = <your_id>;

Но, как сказал @VonC, имейте в виду, что если системная переменная secure_file_priv непуста, вам следует работать с файлами, которые находятся только в определенной директории

2 голосов
/ 24 апреля 2019

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

  1. Я пошел в это местоположение ( C: \ ProgramData \ MySQL \ MySQL Server 8.0 \ my.ini ) и проверил путь secure-file-priv = "C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads" и в этом месте я создал файл "check.txt", в котором у меня есть содержимое.

  2. Iпошел в MySQL верстак и проверил некоторые свойства.Выполните следующую команду

    ПОКАЗАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ, КАК 'local_infile';

, если он показывает OFF, мы должны включить его, используя следующую команду.

SET GLOBAL local_infile=1;

Теперь давайте проверим каталог secure-file-priv он должен 'C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads / uploads' выполнить следующую команду

SHOW VARIABLES LIKE "secure_file_priv" // вы увидите путь как 'C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads / uploads'

Теперь до сих пор мы меняли свойства.Теперь мы готовы читать файлы и создавать файлы, используя mysql.

  1. Чтение данных из txt файла (я уже создал check.txt в "C: / ProgramData / MySQL / MySQL Server 8.0 / Загрузка").Позже создал временную таблицу, в которой я храню данные в check.txt

    CREATE TEMPORARY TABLE foo (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,content 
    longblob); // created temporary table called "foo"
    
    // reading the data from txt file
    
    LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/check.txt'
    INTO TABLE foo 
    #FIELDS TERMINATED BY '' ENCLOSED BY '' ESCAPED BY ''
    LINES STARTING BY '' TERMINATED BY '' // mysql creates new record for every line
    (content); 
    
     //by running above command entire txt data came to content column (mysql created only 1 row bcz we didn't mention lines terminated by. So it will copy entire txt data in 1st row of "content" column of "foo" table)
    
  2. Запись содержимого в файл (в "C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads"directory"

    SELECT * FROM foo
    INTO OUTFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/out.txt'; // out.txt will automatically created by mysql
    

Выполнив указанные выше команды, вы можете выполнять операции чтения и записи.Вы можете использовать вышеуказанные данные таблицы «foo» в своей таблице «see_me» и выполнять операции чтения или записи.

data from "foo" table where id="1" into "see_me" table (file_contents)

Следующие ссылки помогли мне.

документация об ошибках mysql

настройка secure-file-priv в mac и ubuntu

файл my.cnfв mac

my-cnf location

2 голосов
/ 20 апреля 2019

Попробуйте, как здесь , чтобы проверить, где MySql имеет доступ к загрузке, как , указанное в руководстве :

select @@secure_file_priv;

Если системной переменной secure_file_priv присвоено непустое имя каталога, загружаемый файл должен находиться в этом каталоге.
(До MySQL 8.0.17 файл должен быть доступен для чтения всем, а не только для чтения сервером.)

В Windows вам нужно было бы избежать \, как показано в этом ответе 1018 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...