Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过MYSQL存储过程通过JDBC插入韩文字符时出错_Java_Mysql_Unicode_Jdbc_Utf 8 - Fatal编程技术网

Java 通过MYSQL存储过程通过JDBC插入韩文字符时出错

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连接使用正确的queryString参数

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