MariaDB插入BLOB图像

时间:2016-09-05 13:56:44

标签: mysql image null blob mariadb

我想做什么?

  • 我想使用命令行使用LOAD_FILE功能将图片插入MariaDB数据库。

怎么了?

  • 我总是得到一个NULL返回。
  • 想要一个像这样的解决方案:这是糟糕的风格,到目前为止我还没有看到 - 尝试存储完整的路径!我想要将此图片存储在此数据库中,路径。

系统

  • mysql Ver 15.1使用readline 5.1分发10.1.17-MariaDB,用于Linux(x86_64)

  • ArchLinux 4.7.2-1-ARCH

  • /home/user/Blob/Test.jpg/tmp/Test.jpg甚至/var/lib(mysql/images/Test.jpg

  • 下的一张名为 Test.jpg (817KB)的图片
  • 该图片属于用户和组mysql,拥有我可以想象的所有权限

    -rwxrwxrwx  1 mysql mysql 836508 20. Feb 2016  Test.jpg
    
  • 我测试了几个用户,即 mysql 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 /目录)

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

解决此问题的方法

我按照此链接MySQL LOAD_FILE() loads null values

的说明进行操作
  • 我对父目录
  • 有执行权限
  • 明确授予FILE权限。 (GRANT FILE on。至mysql @ localhost)
  • 我获得了特权
  • 我已退出并重新登录
  • 我通过chmodchown命令测试了几个属于 mysql 用户的目录
  • SHOW VARIABLES LIKE 'max_allowed_packet';设置为16 MB或16777216,图片为817KB big
  • select HEX(LOAD_FILE('/home/user/Blob/Test.jpg'));返回NULL

方案吗

我不知道这是MariaDB中的错误,还是我是唯一一个遇到此问题的人。 再次指出这一点:我想要将图片存储在此数据库中。我想要存储路径。这是一个实验,我必须将图片存储在数据库中。

如果有人可以帮我解决这个问题,那真是太棒了!

1 个答案:

答案 0 :(得分:1)

仅当文件位于数据库服务器上时,

LOAD_FILE()才有效。如果服务器与文件位于同一系统上,则加载它应该没有问题。如果是这样,我建议打开有关错误报告不足的错误报告。

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

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

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