我相信我正在为 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 定义更改为utf16
orucs2
不会导致表中出现错误的韩文字符。
在 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);