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 を介して sproc を呼び出すと、期待どおりに機能します。ただし、Java から呼び出すと例外が発生します。

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

興味深いことに、関連するフィールドの sproc 定義をutf16またはに変更するucs2と、例外ではなく、テーブル内の間違った韓国語文字が表示されます。

JavaでSQLパラメータを構築するときに、バイト配列を使用してみました

getBytes(Charset.forName("UTF-8"))

ただし、例外は引き続きスローされます。

ストアド プロシージャを介して CJK 文字を Java から MySQL に正しく渡すためにこれを設定する正しい方法は何ですか?

EDIT 私は春のフレームワークから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 に答える