7

プリペアドステートメントを使用して、特定のテーブルのフィールドにロシア語の文字を格納しようとしています。テーブルとフィールドは、utf8文字セットとutf8_bin照合を使用しています。

IDEまたはコマンドラインから手動で挿入を実行すると、文字列は期待どおりに保存されます。

INSERT INTO utf8Table VALUES('Анатолий Солоницын');

その後、そのテーブルをクエリして、期待される文字列を取得することもできます。

接続は、Tomcatのcontext.xmlファイル内のリソースを介して次の構成でセットアップされます。

<Resource 
    name="jdbc/DoolliDB"  
        auth="Container"   
        type="javax.sql.DataSource"   
        driverClassName="com.mysql.jdbc.Driver"
        useUnicode="true"
        characterEncoding="UTF8"
        ....
</Resource>

私が言ったように、私は文字列/文字をうまく読み取ることができるので、テーブルと接続設定の両方が適切に設定されていると思います。

次のようにPreparedStatement/CallableStatementを使用しています。

CallableStatement callableStmt = __mySqlConnector.getConnection().prepareCall("INSERT INTO utf8Table VALUES(?)");

callableStmt.setString(1, "Анатолий Солоницын");

callableStmt.executeUpdate();

АнатолийСолоницынの代わりに、データベースに挿入されるのは次のとおりです。???????? ?????????

また、überなどの「通常の」utf-8文字列が適切に保存されていることにも注意してください。

両方

System.getProperty("file.encoding") 

java.nio.charset.Charset.defaultCharset().name() 

どちらもUTF-8を返しています。

どんな助けでも大歓迎です。ありがとう

4

2 に答える 2

7

属性ではなく、データベースのURLで接続エンコーディングを定義する必要があります。

<Resource 
    name="jdbc/DoolliDB"  
        auth="Container"   
        type="javax.sql.DataSource"   
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/dbName?characterEncoding=UTF-8"
        ...
</Resource>

http://dev.mysql.com/doc/refman/4.1/en/connector-j-reference-charsets.htmlを参照してください

警告ドライバは文字セットが変更されたことを検出せず、初期接続セットアップ中に検出された文字セットを引き続き使用するため、Connector/Jでクエリ「setnames」を発行しないでください。

于 2013-01-30T12:09:39.343 に答える
0

PHPで使用するSQLステートメントは3つありますが、ここで役立つかもしれません。

  • character_set_results=utf8を設定します
  • character_set_connection=utf8を設定します
  • character_set_client=utf8を設定します

例えば:

CallableStatement callableStmt = __mySqlConnector.getConnection().prepareCall("set character_set_results=utf8");
于 2013-01-29T18:54:24.123 に答える