1

我相信我正在为 jdbc 连接使用正确的 queryString 参数

jdbc:mysql://localhost:3306/databasename?useUnicode=true&characterEncoding=utf8&noAccessToProcedureBodies=true

我的数据库已正确设置为支持 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 调用存储过程按预期工作。但是,从 Java 调用它会导致异常

java.sql.SQLException: Incorrect string value: '\xAC\xED\x00\x05t\x00...' for column '_shortDesc'

有趣的是,将相关字段的 sproc 定义更改为utf16orucs2不会导致表中出现错误的韩文字符。

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

1 回答 1

1

根本问题是我正在使用 springframeworkSimpleJdbcCall来执行存储过程。这通过使用数据库元数据为您解决问题来简化配置。通过在使用该对象时显式声明我的输入参数,调用工作正常。

例如

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

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

于 2012-06-13T13:47:47.850 回答