【问题标题】:Insert file into SQL field and extract back into file将文件插入 SQL 字段并提取回文件
【发布时间】:2019-09-07 03:07:12
【问题描述】:

我创建了简单的表格:

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 的文件。如何使用 sql 命令将文件插入字段 file_contents 并将其同样提取到文件中?

插入可能类似于

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

有人可以建议吗?

【问题讨论】:

  • 有人可以帮忙吗?请告诉我们问题是什么
  • stackoverflow.blog/2018/04/26/… "让我们停止评判用户不知道的事情。(我们是一个问答网站!)"
  • mysql没有openrowset,有没有看load data infile? t.text 是什么样的?
  • t.txt 可以是从文本到二进制的任何形式。什么是mysql load data infile 命令?
  • 我看到这个 ** mysql> UPDATE see_me -> SET file_contents=LOAD_FILE('/Users/usr/lab/t.txt') -> WHERE id=1;查询正常,0 行受影响(0.00 秒)匹配行:1 已更改:0 警告:0 ** 但是,表保持不变。

标签: mysql file


【解决方案1】:

尝试,如in here,检查MySql在哪里有上传权限,如specified in the manual

select @@secure_file_priv;

如果secure_file_priv system variable 设置为非空目录名,则要加载的文件必须位于该目录中。
(在 MySQL 8.0.17 之前,文件必须是所有人可读的,而不仅仅是服务器可读。)

在 Windows 上,您必须将 \ 转义为 show in this answer

【讨论】:

    【解决方案2】:

    您可以使用帮助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 系统变量为非空,您应该使用仅位于已定义目录中的文件

    【讨论】:

    • 该字段仍显示“NULL”。
    • 你的secure_file_priv变量有什么价值?
    【解决方案3】:

    在工作了很多之后,以下事情对我有用。首先,我们必须确保我们是否具有从特定目录读取文件的适当权限。对我来说,它不存在。所以我改变了一些文件。

    1. 我去了这个位置 (C:\ProgramData\MySQL\MySQL Server 8.0\my.ini) 并检查了路径 secure-file-priv="C: /ProgramData/MySQL/MySQL Server 8.0/Uploads”,我在这个位置创建了一个文件“check.txt”,其中包含我的内容。

    2. 我去了 mysql 工作台并检查了一些属性。运行以下命令

      显示像“local_infile”这样的全局变量;

    如果它显示为 OFF,我们必须使用以下命令将其设为 ON。

    SET GLOBAL local_infile=1;
    
    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文件读取数据(我已经在“C:/ProgramData/MySQL/MySQL Server 8.0/Uploads”中创建了check.txt)。后来创建了一个临时表,我将数据存储在 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”目录中)

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

    通过运行上述命令,您可以执行读写操作。您可以在“see_me”表中使用上述“foo”表数据并执行读取或写入操作。

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

    以下链接帮助了我。

    mysql bugs documentation

    setting secure-file-priv in mac and ubuntu

    my.cnf file in mac

    my-cnf location

    【讨论】:

    • mac和ubuntu的文件夹结构不同。我无法找到上述路径或文件,即 my.ini 等。
    • 如果您使用的是 mqsqlworkbench,请运行我提到的命令。在运行命令时,如果您遇到任何 sql 错误(不允许执行此操作等),那么您必须更改 my.cnf 文件的权限(您可以通过我提到的链接更改 my.cnf 文件)。请您浏览一下链接好吗?
    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多