MariaDB插入BLOB图像

4

我想要做什么?

  • 我想使用命令行并使用LOAD_FILE函数将图片插入到MariaDB数据库中。

有什么问题?

  • 我总是得到一个空值返回。
  • 不希望得到这样的解决方案:这是一个糟糕的风格,我之前从未见过 - 尝试存储完整路径!我想要将这个图片存储在这个数据库中,而不是存储路径。

系统

  • mysql Ver 15.1 Distrib 10.1.17-MariaDB, for Linux (x86_64) using readline 5.1

  • ArchLinux 4.7.2-1-ARCH

  • A picture called Test.jpg (817KB) under /home/user/Blob/Test.jpg, /tmp/Test.jpg and even under /var/lib(mysql/images/Test.jpg

  • The picture belongs to the user and group mysql and has every permission I could imagine

    -rwxrwxrwx  1 mysql mysql 836508 20. Feb 2016  Test.jpg
    
  • I tested several users i.e. mysql and root

数据库

我创建了一个名为Blobtest的数据库,其中包含一个名为Test的表格,其中有一个Blob和一个Longblob变量。

CREATE TABLE Test (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,longblobimg LONGBLOB NOT NULL, blobimg BLOB NOT NULL, PRIMARY KEY(id));

+-------------+------------------+------+-----+---------+----------------+
| Field       | Type             | Null | Key | Default | Extra          |
+-------------+------------------+------+-----+---------+----------------+
| id          | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| longblobimg | longblob         | NO   |     | NULL    |                |
| blobimg     | blob             | NO   |     | NULL    |                |
+-------------+------------------+------+-----+---------+----------------+

插入语句

(在这种情况下使用 /home/user/directory)

INSERT INTO Test VALUES (1, LOAD_FILE('/home/user/Blob/Test.jpg'), LOAD_FILE('/home/user/Blob/Test.jpg'));

解决此问题的方法

我按照此链接中的说明进行操作:MySQL LOAD_FILE()加载null值

  • 我拥有父文件夹的执行权限
  • 已明确授权 FILE 权限(GRANT FILE on . TO mysql@localhost)
  • 我已经刷新了权限
  • 我已注销并重新登录
  • 我测试了几个目录,使用 chmodchown 命令属于mysqluser
  • SHOW VARIABLES LIKE 'max_allowed_packet';被设置为 16 MB 或 16777216,图片大小为 817KB。
  • select HEX(LOAD_FILE('/home/user/Blob/Test.jpg'));返回 NULL

解决方案?

我不知道这是否是 MariaDB 的一个 bug,还是只有我遇到了这个问题。 再次强调:我将图片存储在此数据库中。我不想存储路径。这是一个实验,我必须将图片存储在数据库中。

如果有人能帮我解决这个问题,那就太棒了!


问题:你的“my.cnf”配置文件中是否有这个参数:local-infile=1? - FragBis
我没有这样的参数 - 我在“my.cnf”中添加了:local-infile=1,但仍然出现了这个错误。 - user6796530
你需要在标签[mysql]和[mysqld]之后放置此参数,以明确允许mysql客户端和服务器使用本地文件(但我通常使用此参数来使用“LOAD DATA LOCAL INFILE”)。你的问题可能与你的Linux发行版有关。我正在使用最新的Linux Mint,“SELECT LOAD_FILE(...)”运行良好。 - FragBis
你使用的是哪个客户端? - Rick James
检查selinux是否阻止访问。 - Rick James
显示剩余3条评论
1个回答

2

LOAD_FILE() 只有在文件位于数据库服务器上时才能正常工作。如果服务器与文件位于同一系统上,则加载文件应该没有问题。如果有问题,建议提供关于不充分的错误报告的错误报告。

将数据二进制加载到服务器的其他方法

通常,连接器提供将二进制数据加载到数据库中的方法。例如,MariaDB C连接器提供mysql_stmt_send_long_data

另一种选择是在客户端将数据转换为非二进制编码(例如base64或hex),并在服务器上进行解码(使用FROM_BASE64进行base64解码,使用UNHEX进行hex解码)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接