通过MYSQL存储过程通过JDBC插入韩语字符给出错误

时间:2012-06-12 15:14:02

标签: java mysql unicode jdbc utf-8

我相信我正在为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定义更改为utf16ucs2会导致表中没有异常但韩文字符不正确。

在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);

1 个答案:

答案 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);

我意识到这个答案无法从我原来的问题中得出,所以我添加了一个编辑。