Java 通过MYSQL存储过程通过JDBC插入韩文字符时出错
我相信我正在为jdbc连接使用正确的queryString参数Java 通过MYSQL存储过程通过JDBC插入韩文字符时出错,java,mysql,unicode,jdbc,utf-8,Java,Mysql,Unicode,Jdbc,Utf 8,我相信我正在为jdbc连接使用正确的queryString参数 jdbc:mysql://localhost:3306/databasename?useUnicode=true&characterEncoding=utf8&noAccessToProcedureBodies=true 我的数据库支持utf-8(默认字符变量) 我的存储过程在必要时将每个参数定义为utf8 IN _shortDesc MEDIUMTEXT character set utf8, 通过MySQLW
jdbc:mysql://localhost:3306/databasename?useUnicode=true&characterEncoding=utf8&noAccessToProcedureBodies=true
我的数据库支持utf-8(默认字符变量)
我的存储过程在必要时将每个参数定义为utf8
IN _shortDesc MEDIUMTEXT character set utf8,
通过MySQLWorkbench调用存储过程的效果与预期一样。
但是,从Java调用它会导致异常
java.sql.SQLException: Incorrect string value: '\xAC\xED\x00\x05t\x00...' for column '_shortDesc'
有趣的是,将相关字段的存储过程定义更改为utf16
或ucs2
不会导致异常,但会导致表中出现不正确的韩语字符
在Java中构建sql参数时,我也尝试过使用字节数组
getBytes(Charset.forName("UTF-8"))
但是仍然会抛出异常
正确的设置方法是什么,以便通过存储过程通过Java将CJK字符正确地传递给MySQL
编辑
我正在使用spring框架中的SimpleJDBCall
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);
根本问题是我正在使用springframework
SimpleJDBCall
执行存储过程。通过使用数据库元数据为您解决问题,简化了配置。通过在使用该对象时显式声明输入参数,调用可以正常工作
e、 g
我意识到这个答案不可能从我原来的问题中得出,所以我添加了一个编辑 根本问题是我正在使用springframework
SimpleJDBCall
执行存储过程。通过使用数据库元数据为您解决问题,简化了配置。通过在使用该对象时显式声明输入参数,调用可以正常工作
e、 g
我意识到这个答案不可能从我原来的问题中得出,所以我添加了一个编辑 你能粘贴你要插入的字符串(或其中有问题的部分)吗?不用说,\xAC\xED是无效的UTF-8,这些零字节看起来也很奇怪。任何韩文、中文或日文文本都会失败-这里有一个直接调用存储过程的代码片段,它可以正常工作(因此不是错误的文本-它一定是jdbc驱动程序)。겠겠지만无法重现MySQL 5.5和Connector/J 5.1.20的问题:这可能只是驱动程序问题的一个版本。我使用的是springs jdbc包。我用5.1.20试过你的代码,效果很好。你能粘贴你要插入的字符串(或它的不合适的部分)吗?不用说,\xAC\xED是无效的UTF-8,这些零字节看起来也很奇怪。任何韩文、中文或日文文本都会失败-这里有一个直接调用存储过程的代码片段,它可以正常工作(因此不是错误的文本-它一定是jdbc驱动程序)。겠겠지만无法重现MySQL 5.5和Connector/J 5.1.20的问题:这可能只是驱动程序问题的一个版本。我使用的是springs jdbc包。我使用5.1.20尝试了你的代码,效果很好。
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);
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);