如果我首先在连接上运行命令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而不是字符。 知道如何解决这个问题吗?