20

我在 mySQL 中有一个表,其中有一个名为“image”的字段,其数据类型为“BLOB”。我想知道是否可以直接从命令行客户端上传该字段中的图像,而不是通过 php...如果可以,那么我应该将图像文件放在哪里?

4

6 回答 6

28

尝试使用LOAD_FILE()函数。

UPDATE `certain_table`
SET image = LOAD_FILE('/full/path/to/new/image.jpg')
WHERE id = 1234;

有关文件名路径、权限等的要求,请参阅手册。

于 2011-12-08T23:32:54.627 回答
9

LOAD_FILE仅适用于某些特权并且如果文件在服务器上。我找到了一种让它完全在客户端工作的方法:

mysql -e "update mytable set image=FROM_BASE64('`base64 -i image.png`')" DBNAME

这个想法是将图像动态编码为base64,然后让MySql对其进行解码。

于 2016-12-07T12:58:14.797 回答
6

这是Teudimundo答案的变体,适用于较旧的 MySQL 版本,其中 Base64 函数不可用:

mysql -e "update mytable set col = x'$(xxd -p image.png | tr -d \\n)' where ..."

诀窍是用来xxd -p将二进制文件转换为普通的 hexdump:

$ xxd -p /usr/share/font-manager/data/blank.png
89504e470d0a1a0a0000000d4948445200000040000000400806000000aa
6971de000000274944415478daedc1010d000000c220fba77e0e37600000
00000000000000000000000000c0bd0040400001ee1dbb2f000000004945
4e44ae426082

然后使用tr -d \\n删除换行符,最后将结果嵌入到 MySQL 特定的 hexdump 字符串文字中:x'...'

于 2017-05-17T16:06:45.690 回答
2

我建议您永远不要将图像直接上传到数据库中,这非常低效。最好简单地存储图像的位置和名称,并将这些图像存储在某个文件夹中。

如果你想通过命令行“上传”,你可以这样做:

insert into table(image_loc) values('/images/random/cool.jpg') where id=1;

并且根据您的环境,您可以使用 shell 访问来移动图像。我不太确定您要如何处理这些图像或您的系统是如何设置的。你可能需要澄清这一点。

于 2011-12-08T23:33:44.983 回答
0

最好构建一个示例应用程序,然后将值插入数据库中。例如,此方法可用于将 BLOB 数据类型输入数据库...

[WebMethod]
                public string sendDataToMySql(string get_name, byte[] buffer)
                {
                    string MyConString = "SERVER=localhost;" +
                          "DATABASE=test;" +
                          "UID=root;" +
                          "PASSWORD=admin;";


                    MySqlConnection connection = new MySqlConnection(MyConString);
                    connection.Open();
                    MySqlCommand command = new MySqlCommand("", connection);
                    command.CommandText = "insert into testImage(name, image) values(@name, @image);";


                    MySqlParameter oParam1 = command.Parameters.Add("@name", MySqlDbType.VarChar, 50);
                    oParam1.Value = get_name;


                    MySqlParameter oParam2 = command.Parameters.Add("@image", MySqlDbType.Blob);
                    oParam2.Value = buffer;

                    command.ExecuteNonQuery();

                    connection.Close();
                    return "Data was inserted successfully!";
                   }
于 2011-12-20T18:44:22.047 回答
0

有时我们尝试使用 loadfile 上传文件,但文件未加载或格式化文本中的文件路径存储在 BLOB 字段中。这是因为访问问题。如果您遇到这种情况,请尝试从 mysql 的数据路径加载它,而不是从任何位置加载文件,最好像:

INSERT INTO `srms`.`images` (`ID`, `Image`) VALUES ('5', load_file('C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\test.jpg'));
于 2017-08-03T04:38:54.763 回答