4

BiRT でレポートを生成するために使用される JDBC を使用して、MySQL データベースから結果セットを取得しようとしています。接続文字列は BiRT で設定されます。

データベースは latin1 です。

SHOW VARIABLES LIKE 'c%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     | 
| character_set_connection | latin1                     | 
| character_set_database   | latin1                     | 
| character_set_filesystem | binary                     | 
| character_set_results    | latin1                     | 
| character_set_server     | latin1                     | 
| character_set_system     | utf8                       | 
| character_sets_dir       | /usr/share/mysql/charsets/ | 
| collation_connection     | latin1_swedish_ci          | 
| collation_database       | latin1_swedish_ci          | 
| collation_server         | latin1_swedish_ci          | 
| completion_type          | 0                          | 
| concurrent_insert        | 1                          | 
| connect_timeout          | 5                          | 
+--------------------------+----------------------------+

そのため、返される奇妙に見えるエンコード結果 (ドイツ語の文字) を修正しようとしています。次のように、結果セットを「latin1」として取得する「characterSetResults」プロパティが理にかなっていると思いました。

jdbc:mysql://localhost:3306/statistics?useUnicode=true&characterEncoding=latin1&characterSetResults=latin1

この接続文字列は失敗し、推論により、それが次のプロパティであることがわかりました。

characterSetResults=latin1

接続が失敗する原因となっています。エラーは長い Java エラーで、私にはほとんど意味がありません。それでは始まります:

org.eclipse.birt.report.data.oda.jdbc.JDBCException: There is an error in get connection, Communications link failure

Last packet sent to the server was 38 ms ago..
    at org.eclipse.birt.report.data.oda.jdbc.JDBCDriverManager.doConnect(JDBCDriverManager.java:262)
    at org.eclipse.birt.report.data.oda.jdbc.JDBCDriverManager.getConnection(JDBCDriverManager.java:186)
    at org.eclipse.birt.report.data.oda.jdbc.JDBCDriverManager.tryCreateConnection(JDBCDriverManager.java:706)
    at org.eclipse.birt.report.data.oda.jdbc.JDBCDriverManager.testConnection(JDBCDriverManager.java:634)
    at org.eclipse.birt.report.data.oda.jdbc.ui.util.DriverLoader.testConnection(DriverLoader.java:120)
    at org.eclipse.birt.report.data.oda.jdbc.ui.util.DriverLoader.testConnection(DriverLoader.java:133)
    at org.eclipse.birt.report.data.oda.jdbc.ui.profile.JDBCSelectionPageHelper.testConnection(JDBCSelectionPageHelper.java:687)
    at org.eclipse.birt.report.data.oda.jdbc.ui.profile.JDBCSelectionPageHelper.access$7(JDBCSelectionPageHelper.java:655)
    at org.eclipse.birt.report.data.oda.jdbc.ui.profile.JDBCSelectionPageHelper$7.widgetSelected(JDBCSelectionPageHelper.java:578)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:234)

これを次のように変更すると:

 characterSetResults=utf8

接続文字列はエラーなしで接続されますが、エンコードの問題は残ります。

latin1 を取得する正しい方法を知っている人はいますか? はい、UTF8 を使用することは知っていますが、これは私のデータベースではありません....

これを読んでくれてありがとう、スティーブン

4

2 に答える 2

0

クライアント側で文字エンコーディングを指定する場合は、Java スタイルの名前 ( Mysql connector-j-reference- charsets ) を使用します。したがって、 jdbc:mysql://localhost:3306/statistics?useUnicode=true&characterEncoding=utf を使用して動作するはずです。 -8&characterSetResults=Cp1252

于 2015-10-28T06:46:37.163 に答える
0

掘り下げた後、試しましたcharacterSetResults=ISO8859_1か?これは latin1 と同等であり、MySQL がこれをより適切に処理するという証拠があります。

これをテストするためのDBはありませんが、私が読んだものは、必要なものにぴったりのようです。

于 2011-04-05T14:38:43.497 に答える