JDBC在Properties中配置utf8mb4

时间:2017-07-04 15:12:41

标签: mysql scala jdbc spark-dataframe utf8mb4

如果我首先在连接上运行命令SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci',我可以将utf8mb4字符(例如)写入MySQL数据库表:

  connection = DriverManager.getConnection(url, prop)
  val config: PreparedStatement = connection.prepareStatement("SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'");
  config.executeUpdate();
  val insert: PreparedStatement = connection.prepareStatement("INSERT INTO test "
    + "(ID, NAME) VALUES (?,?)");
  insert.setInt(1, 20);
  insert.setString(2, "test ");
  insert .executeUpdate();

但是,我需要使用Spark将数据帧写入数据库,并且API不允许我访问连接。我只能传递将用于建立连接的属性(或在URL上传递它们):

val prop = new Properties()
prop.put("user", username)
prop.put("driver", "com.mysql.cj.jdbc.Driver")
prop.put("characterEncoding", "UTF-8") // doesn't accept utf8mb4
prop.put("connectionCollation", "utf8mb4_unicode_ci")

df.write.mode("overwrite").jdbc(s"jdbc:mysql://$dbUrl/$dbName", dbTable, prop)

这不起作用。我无法通过utf8mb4作为编码,因为Java lib会抛出错误,这些设置会阻止我的应用程序崩溃,但它会保存???到db而不是字符。 知道如何解决这个问题吗?

0 个答案:

没有答案