我相信我正在为jdbc连接使用正确的queryString参数
jdbc:mysql://localhost:3306/databasename?useUnicode=true&characterEncoding=utf8&noAccessToProcedureBodies=true
我的数据库是correctly set-up以支持utf-8(默认字符变量)。
character_set_client utf8
character_set_connection utf8
character_set_database latin1
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
我的sproc在必要时将每个参数定义为utf8
IN _shortDesc MEDIUMTEXT character set utf8,
通过MySQLWorkbench调用sproc按预期工作。 但是,从Java调用它会导致异常
java.sql.SQLException: Incorrect string value: '\xAC\xED\x00\x05t\x00...' for column '_shortDesc'
有趣的是,将相关字段的sproc定义更改为utf16
或ucs2
会导致表中没有异常但韩文字符不正确。
在Java中构建sql参数时,我也尝试使用字节数组
getBytes(Charset.forName("UTF-8"))
但仍然抛出异常。
通过存储过程将正确的CJK字符通过Java传递给MySQL的正确方法是什么?
修改 的 我正在使用spring框架中的SimpleJdbcCall
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://server/test?characterEncoding=utf8");
ds.setUsername("user");
ds.setPassword("pass");
// must explicitly declare params
SimpleJdbcCall jdbc = new SimpleJdbcCall(ds)
.withProcedureName("sp_gms_addGameTranslationsTest");
SqlParameterSource in = new MapSqlParameterSource()
.addValue("_test", "그러나 사디라");
jdbc.execute(in);
答案 0 :(得分:1)
根问题是我使用springframework SimpleJdbcCall
来执行存储过程。这通过使用数据库元数据为您解决问题简化了配置。通过在使用该对象时显式声明我的输入参数,该调用可以正常工作。
e.g。
DriverManagerDataSource ds = new DriverManagerDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://server/test?characterEncoding=utf8");
ds.setUsername("user");
ds.setPassword("pass");
// must explicitly declare params
SimpleJdbcCall jdbc = new SimpleJdbcCall(ds)
.withProcedureName("sp_gms_addGameTranslationsTest")
.declareParameters(
new SqlParameter("_test", Types.VARCHAR)
);
SqlParameterSource in = new MapSqlParameterSource()
.addValue("_test", "그러나 사디라");
jdbc.execute(in);
我意识到这个答案无法从我原来的问题中得出,所以我添加了一个编辑。