当我将图像插入 MySQL table 时,结果为 NULL
When I insert a image into MySQL table the result is NULL
这段代码有什么问题,我想插入一张图片到table,但是当我执行这段代码时,图像字段的结果是NULL
。
我尝试 MySQL Workbench 执行:
CREATE TABLE image(keyh int, img blob);
INSERT INTO image VALUES(1, load_file('d:\Picture\cppLogo.png'));
To use this function, the file must be located on the server host, you
must specify the full path name to the file, and you must have the
FILE privilege. The file must be readable by all and its size less
than max_allowed_packet bytes. If the secure_file_priv system variable
is set to a nonempty directory name, the file to be loaded must be
located in that directory.
If the file does not exist or cannot be read because one of the
preceding conditions is not satisfied, the function returns NULL.
http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file
你能做什么?
检查哪个用户 mysql 是 运行,并确保该用户可以读取该文件。确保安全设置允许读取文件并且文件大小不超过 max_allowed_packet
.
见SHOW VARIABLES LIKE 'max_allowed_packet'
。
对我来说,文件似乎在您的本地主机上,您尝试上传它。使用 LOAD_FILE()
是不可能的。该文件必须已经在服务器上。
这个问题也可能是由你的windows目录分隔符\
(如所说)引起的,它是用来转义的,切换到unix风格/
然后:
LOAD_FILE('D:/Picture/cppLogo.png')
或者您的图片的文件大小超过 BLOB
字段可以容纳的大小,如 所说。
我发现正确的语法如下:
C:/wamp/binsql5.5.20/data/56VRLRFE.jpg'
不是这个
C:\wamp\binsql5.5.20\dataVRLRFE.jpg'
感谢大家的回答:D
打开您的 MySql 命令行客户端并使用 root 用户登录并键入
mysql> SHOW VARIABLES LIKE "secure_file_priv";
这将向您显示 MySql 用来访问文件的安全路径。像
+------------------+-----------------------+
| Variable_name | Value |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
您可以将文件粘贴到此文件夹中或将 "secure_file_priv" 变量值更改为 "empty string" 以便它可以从任何地方读取文件。
在 Windows 上,根本问题是 MySql 默认情况下作为网络帐户下的 Windows 服务运行,这意味着服务器只有几个文件位置可以访问。因此,要使 load_file 正常工作,文件必须放在服务器上可以被服务读取的文件夹中。似乎没有关于此的文档。在我的调查中,唯一适用于 load_file 的文件夹是 C:\ProgramData\MySQL\MySQL Server 8.0\Uploads
运行 测试负载的查询...
select load_file('C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\1.txt') ;
注意 windows 您必须使用双 \ 或 / 来分隔路径元素。这将 return 失败时为 NULL,否则为文件内容。
现在假设一个名为 db.image 的 table 包含列 source 和 image。源是字符,图像是 blob。将 a.jpg 加载到 table 的命令是
insert into db.image (source,image) values ('a.jpg',load_file('c:/programdata/mysql/mysql server 8.0/uploads/a.jpg'));
直接存储例如没有文件夹名称-
create table myimg(id int, image mediumblob);
insert into myimg values(101, load_file("E://xyz.png"));
这段代码有什么问题,我想插入一张图片到table,但是当我执行这段代码时,图像字段的结果是NULL
。
我尝试 MySQL Workbench 执行:
CREATE TABLE image(keyh int, img blob);
INSERT INTO image VALUES(1, load_file('d:\Picture\cppLogo.png'));
To use this function, the file must be located on the server host, you must specify the full path name to the file, and you must have the FILE privilege. The file must be readable by all and its size less than max_allowed_packet bytes. If the secure_file_priv system variable is set to a nonempty directory name, the file to be loaded must be located in that directory.
If the file does not exist or cannot be read because one of the preceding conditions is not satisfied, the function returns NULL.
http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file
你能做什么?
检查哪个用户 mysql 是 运行,并确保该用户可以读取该文件。确保安全设置允许读取文件并且文件大小不超过 max_allowed_packet
.
见SHOW VARIABLES LIKE 'max_allowed_packet'
。
对我来说,文件似乎在您的本地主机上,您尝试上传它。使用 LOAD_FILE()
是不可能的。该文件必须已经在服务器上。
这个问题也可能是由你的windows目录分隔符\
(如/
然后:
LOAD_FILE('D:/Picture/cppLogo.png')
或者您的图片的文件大小超过 BLOB
字段可以容纳的大小,如
我发现正确的语法如下:
C:/wamp/binsql5.5.20/data/56VRLRFE.jpg'
不是这个
C:\wamp\binsql5.5.20\dataVRLRFE.jpg'
感谢大家的回答:D
打开您的 MySql 命令行客户端并使用 root 用户登录并键入
mysql> SHOW VARIABLES LIKE "secure_file_priv";
这将向您显示 MySql 用来访问文件的安全路径。像
+------------------+-----------------------+
| Variable_name | Value |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
您可以将文件粘贴到此文件夹中或将 "secure_file_priv" 变量值更改为 "empty string" 以便它可以从任何地方读取文件。
在 Windows 上,根本问题是 MySql 默认情况下作为网络帐户下的 Windows 服务运行,这意味着服务器只有几个文件位置可以访问。因此,要使 load_file 正常工作,文件必须放在服务器上可以被服务读取的文件夹中。似乎没有关于此的文档。在我的调查中,唯一适用于 load_file 的文件夹是 C:\ProgramData\MySQL\MySQL Server 8.0\Uploads
运行 测试负载的查询...
select load_file('C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\1.txt') ;
注意 windows 您必须使用双 \ 或 / 来分隔路径元素。这将 return 失败时为 NULL,否则为文件内容。
现在假设一个名为 db.image 的 table 包含列 source 和 image。源是字符,图像是 blob。将 a.jpg 加载到 table 的命令是
insert into db.image (source,image) values ('a.jpg',load_file('c:/programdata/mysql/mysql server 8.0/uploads/a.jpg'));
直接存储例如没有文件夹名称-
create table myimg(id int, image mediumblob);
insert into myimg values(101, load_file("E://xyz.png"));