我正在尝试将图像文件插入mySql数据库的mediumtext字段中。 我们的想法是使用Java IO从图像文件中获取byteStream,并将byteStream转换为读取器(我称之为UTF-8字符流)。然后我将读取器数据插入mysql mediumtext字段。但是当我运行我的代码时,我收到错误说无效的字符串。代码和日志都在下面提供。请告诉我,如果我在这里遗漏任何东西。
注意: - 我成功将数据存储在longblob字段中
代码: -
object SimpleApp extends App{
Class.forName("com.mysql.jdbc.Driver")
val jdbcUsername = "root"
val jdbcPassword = "mysqladmin"
val jdbcHostname = "XXXXXXX"
val jdbcPort = 3306
val jdbcDatabase ="XXXXXX"
val ImgPath = new File("C:\\Users\\ezswapr\\IdeaProjects\\DataStructure\\org.priyaranjan.ds\\src\\output\\" + "Desert.jpg")
val fileinput = new FileInputStream(ImgPath)
val reader =new InputStreamReader(fileinput,"UTF-8") // Converting byte sream to character stream of UTF-8
val jdbcUrl = s"jdbc:mysql://${jdbcHostname}:${jdbcPort}/${jdbcDatabase}?user=${jdbcUsername}&password=${jdbcPassword}"
val connection = DriverManager.getConnection(jdbcUrl, jdbcUsername, jdbcPassword)
val stmt = connection.createStatement();
val sql= s""" create table test_blob (data mediumtext) DEFAULT CHARSET=utf8"""
stmt.executeUpdate(sql)
val ps= connection.prepareStatement("insert into test_blob(data) values(?);")
ps.setCharacterStream(1,reader)
ps.execute()
connection.isClosed()
}
错误: -
Exception in thread "main" java.sql.SQLException: Incorrect string value: '\xF0\x94\x91\xA9\xEF\xBF...' for column 'data' at row 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:116)
at com.mysql.cj.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1867)
at com.mysql.cj.jdbc.PreparedStatement.execute(PreparedStatement.java:1155)
at SimpleApp$.delayedEndpoint$SimpleApp$1(SarojCode.scala:74)
at SimpleApp$delayedInit$body.apply(SarojCode.scala:18)
at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.App$$anonfun$main$1.apply(App.scala:76)
at scala.collection.immutable.List.foreach(List.scala:381)
at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
at scala.App$class.main(App.scala:76)
at SimpleApp$.main(SarojCode.scala:18)
at SimpleApp.main(SarojCode.scala)
答案 0 :(得分:2)
如果必须在dbms中存储图像数据,则应使用MEDIUMBLOB
而不是MEDIUMTEXT
数据。为什么?图像(JPEG,PNG,GIF等)包含二进制数据,但Java和MySQL都希望将图像数据解释为文本(在您的情况下为utf8文本)。但他们对你的形象表示反对,因为它不是有效的文字。
使用这行代码,您断言您的文件包含utf8格式的数据,并且应该将其转换为Java的内部Unicode表示形式,因为它从文件读取到RAM中。
val reader =new InputStreamReader(fileinput,"UTF-8")
那不是真的。您的JPEG文件不包含UTF-8数据。尝试将其转换为Unicode字符是没有意义的。那就是你的错误字符串值异常意味着什么。
但是,专业提示:将图片内容存储在文件系统中,并将路径存储到数据库中。为什么?通过网络提供图像的速度更快。另外,正如您所发现的那样,编写代码来保存和检索DBMS中的图像会给您带来痛苦。