关于Java向MySql数据库中插入Blob数据时报错的难题

cqulyk 2014-07-27 07:11:49
我有如下代码,目的是向MySql数据库中插入一张名为Sheldon.gif的图片,
MySql表创建语句如下:
CREATE TABLE userblob
(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(30) NOT NULL,
photo LONGBLOB
);


Java程序代码如下:
import java.sql.Connection ;
import java.sql.DriverManager ;
import java.sql.SQLException ;
import java.sql.PreparedStatement ;
import java.io.File ;
import java.io.FileInputStream ;
import java.io.InputStream ;
public class BlobDemo01{
// 定义MySQL的数据库驱动程序
public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
// 定义MySQL数据库的连接地址
public static final String DBURL = "jdbc:mysql://localhost:3306/testDatabase" ;
// MySQL数据库的连接用户名
public static final String DBUSER = "root" ;
// MySQL数据库的连接密码
public static final String DBPASS = "mysqladmin" ;
public static void main(String args[]) throws Exception{ // 所有异常抛出
Connection conn = null ; // 数据库连接
PreparedStatement pstmt = null ;
String name = "Sheldon" ;
String sql = "INSERT INTO userblob(name,photo) VALUES (?,?) " ;
Class.forName(DBDRIVER) ; // 加载驱动程序
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASS) ;
pstmt = conn.prepareStatement(sql) ;
File f = new File("d:" + File.separator + "Sheldon.gif") ; // 图片文件
InputStream input = null ;
input = new FileInputStream(f) ;
pstmt.setString(1,name) ; // 设置第一个“?”的内容
pstmt.setBinaryStream(2,input,(int)f.length()) ; // 设置输入流
pstmt.executeUpdate() ; // 更新数据库
pstmt.close() ;
conn.close() ; // 数据库关闭
}
};


Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an er
ror in your SQL syntax; check the manual that corresponds to your MySQL server version for the right
syntax to use near '\0\0\0\0?€?0\0?€?0\0\0\0\00221?\0\0\0\0\0\0è?‘\0\0\0\0\0\0é??\0\0\
' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330)
at BlobDemo01.main(BlobDemo01.java:30)
...全文
349 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZeWe 2017-03-26
  • 打赏
  • 举报
回复
引用 9 楼 cqulyk 的回复:
[quote=引用 8 楼 xiangnan129 的回复:] [quote=引用 7 楼 cqulyk 的回复:] [quote=引用 6 楼 xiangnan129 的回复:] [quote=引用 5 楼 xiangnan129 的回复:] 如果你确定就是利用你现有的这个程序,上传txt没有问题的话,就考虑一下是不是数据库的字符集的问题,有可能是你插入的图片是二进制流,而字符集与数据库的字符集不一致,导致数据库报错。你试着将数据库的字符集改成utf-8看看。
记得重启数据库。[/quote] 真的非常感谢你,问题按照你的方式解决了。能不能跟我解释一下“而字符集与数据库的字符集不一致,导致数据库报错。”这句话是什么意思,感谢![/quote] 就是说你的数据库存储该字段的字符集编码必须与你将要插入的数据的字符集编码一致,否则会因为字符集不一致而无法存储的问题。因为字符集不一致它无法按照数据库存储数据的形式进行存储 。PS:最后这句话是我自己猜测的。 还有就是一般图片是不会直接存储到数据库中,因为这样既浪费数据库存储空间,而且读取也比较慢,可以将图片上传到服务器(本地就是工程目录)下,然后将该图片的url存到数据库中,与图片描述,上传者等一起构成一条记录。[/quote] 谢谢!你后面说的,我也知道,不过作为一个初学者,将一张图片存入数据库我认为是一件很cool的事(:。 请问我数据库的编码和程序的编码应该怎样设置才合适,才能避免出现我上面遇到的问题?[/quote] 我也遇到这个问题了,修改过字符集还是有错误!请大牛解惑!
cqulyk 2014-08-05
  • 打赏
  • 举报
回复
引用 8 楼 xiangnan129 的回复:
[quote=引用 7 楼 cqulyk 的回复:] [quote=引用 6 楼 xiangnan129 的回复:] [quote=引用 5 楼 xiangnan129 的回复:] 如果你确定就是利用你现有的这个程序,上传txt没有问题的话,就考虑一下是不是数据库的字符集的问题,有可能是你插入的图片是二进制流,而字符集与数据库的字符集不一致,导致数据库报错。你试着将数据库的字符集改成utf-8看看。
记得重启数据库。[/quote] 真的非常感谢你,问题按照你的方式解决了。能不能跟我解释一下“而字符集与数据库的字符集不一致,导致数据库报错。”这句话是什么意思,感谢![/quote] 就是说你的数据库存储该字段的字符集编码必须与你将要插入的数据的字符集编码一致,否则会因为字符集不一致而无法存储的问题。因为字符集不一致它无法按照数据库存储数据的形式进行存储 。PS:最后这句话是我自己猜测的。 还有就是一般图片是不会直接存储到数据库中,因为这样既浪费数据库存储空间,而且读取也比较慢,可以将图片上传到服务器(本地就是工程目录)下,然后将该图片的url存到数据库中,与图片描述,上传者等一起构成一条记录。[/quote] 谢谢!你后面说的,我也知道,不过作为一个初学者,将一张图片存入数据库我认为是一件很cool的事(:。 请问我数据库的编码和程序的编码应该怎样设置才合适,才能避免出现我上面遇到的问题?
scott_129 2014-08-05
  • 打赏
  • 举报
回复
引用 7 楼 cqulyk 的回复:
[quote=引用 6 楼 xiangnan129 的回复:] [quote=引用 5 楼 xiangnan129 的回复:] 如果你确定就是利用你现有的这个程序,上传txt没有问题的话,就考虑一下是不是数据库的字符集的问题,有可能是你插入的图片是二进制流,而字符集与数据库的字符集不一致,导致数据库报错。你试着将数据库的字符集改成utf-8看看。
记得重启数据库。[/quote] 真的非常感谢你,问题按照你的方式解决了。能不能跟我解释一下“而字符集与数据库的字符集不一致,导致数据库报错。”这句话是什么意思,感谢![/quote] 就是说你的数据库存储该字段的字符集编码必须与你将要插入的数据的字符集编码一致,否则会因为字符集不一致而无法存储的问题。因为字符集不一致它无法按照数据库存储数据的形式进行存储 。PS:最后这句话是我自己猜测的。 还有就是一般图片是不会直接存储到数据库中,因为这样既浪费数据库存储空间,而且读取也比较慢,可以将图片上传到服务器(本地就是工程目录)下,然后将该图片的url存到数据库中,与图片描述,上传者等一起构成一条记录。
cqulyk 2014-08-05
  • 打赏
  • 举报
回复
引用 6 楼 xiangnan129 的回复:
[quote=引用 5 楼 xiangnan129 的回复:] 如果你确定就是利用你现有的这个程序,上传txt没有问题的话,就考虑一下是不是数据库的字符集的问题,有可能是你插入的图片是二进制流,而字符集与数据库的字符集不一致,导致数据库报错。你试着将数据库的字符集改成utf-8看看。
记得重启数据库。[/quote] 真的非常感谢你,问题按照你的方式解决了。能不能跟我解释一下“而字符集与数据库的字符集不一致,导致数据库报错。”这句话是什么意思,感谢!
scott_129 2014-08-05
  • 打赏
  • 举报
回复
引用 5 楼 xiangnan129 的回复:
如果你确定就是利用你现有的这个程序,上传txt没有问题的话,就考虑一下是不是数据库的字符集的问题,有可能是你插入的图片是二进制流,而字符集与数据库的字符集不一致,导致数据库报错。你试着将数据库的字符集改成utf-8看看。
记得重启数据库。
scott_129 2014-08-05
  • 打赏
  • 举报
回复
如果你确定就是利用你现有的这个程序,上传txt没有问题的话,就考虑一下是不是数据库的字符集的问题,有可能是你插入的图片是二进制流,而字符集与数据库的字符集不一致,导致数据库报错。你试着将数据库的字符集改成utf-8看看。
cqulyk 2014-08-05
  • 打赏
  • 举报
回复
有人知道为什么吗?我的程序可以成功的插入txt文件,但当我把文件换成图片文件或者其他文件的时候就会有以上错误。拜托了!
文哥xxx 2014-07-28
  • 打赏
  • 举报
回复
把 id 插入试一下
cqulyk 2014-07-28
  • 打赏
  • 举报
回复
有谁知道吗?
cqulyk 2014-07-27
  • 打赏
  • 举报
回复
程序运行后,我得到了如下错误,大意是我的Sql语句语法有问题,但我确信我的SQL语法是正确的,请大家帮我看看这个问题怎么解决,感谢!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧