3

一連の XML ファイルを解析し、それらから取得した値を MySQL データベースに挿入しています。mysql テーブルの文字セットは utf8 に設定されています。次の接続 URL を使用してデータベースに接続しています -jdbc:mysql://localhost:3306/articles_data?useUnicode=false&characterEncoding=utf8

ユニコード文字を含む文字列値のほとんどは、数学記号を含むものを除いて、問題なく入力できます (ギリシャ文字など)。特に例 - 数学スクリプトの大文字 g (www.ncbi.nlm.nih.gov/corehtml/pmc/pmcents/1D4A2.gif の画像) ( http://graphemica.com/ ) を使用して文字列を挿入しようとした場合(この記事を解析して挿入しようとしています)、次の例外が発生します-

java.sql.SQLException: Incorrect string value: '\xF0\x9D\x92\xA2 i...' for column 'text' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3515)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2554)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1761)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2046)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1964)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1949)

接続 URL を jdbc:mysql://localhost:3306/articles_data に変更すると、挿入は機能しますが、通常の UTF8 文字はすべて疑問符に置き換えられます。

私がそれを修正しようとしている2つの可能な方法があり、どちらもまだ成功していません-

  1. 記事を解析するときは、エンコーディングを維持します。xml ファイルを解析するために使用org.apache.xerces.parsers.DOMParserしていますが、デコードを防ぐ方法がわかりません (関連する XML - <p>&#x1d4a2; is a set containing...</p>)。再エンコードすることはできますが、それは効率が悪いようです。

  2. 数学記号をデータベースに挿入します。

4

1 に答える 1

6

バージョン 5.1 までの MySQL は、基本的な多言語プレーンで Unicode 文字のみをサポートしているようです。これは、utf-8 としてエンコードされた場合に 3 バイトしか必要としません。バージョン 5.1 の Unicode サポートに関するマニュアルから:

MySQL 5.1 は、Unicode データを格納するための 2 つの文字セットをサポートしています。

  • ucs2、1 文字あたり 16 ビットを使用する Unicode 文字セットの UCS-2 エンコーディング
  • utf8、1 文字あたり 1 ~ 3 バイトを使用する Unicode 文字セットの UTF-8 エンコーディング

バージョン 5.5では、いくつかの新しい文字セットが追加されました。

...

  • utf8mb4、1 文字あたり 1 ~ 4 バイトを使用する Unicode 文字セットの UTF-8 エンコーディング

ucs2 と utf8 は BMP 文字をサポートします。utf8mb4、utf16、および utf32 は、BMP および補助文字をサポートします。

そのため、mysql 5.1 を使用している場合は、最初にアップグレードする必要があります。それ以降のバージョンでは、これらの補助文字を使用するには、文字セットを utf8mb4 に変更する必要があります。

jdbc コネクタにもさらに設定が必要なようです ( Connector/J Notes and Tipsから):

Connector/J で 4 バイト UTF8 を使用するには、MySQL サーバーを で構成しますcharacter_set_server=utf8mb4characterEncodingConnector/J は、接続文字列に設定されていない限り、その設定を使用します。これは、文字セットの自動検出に相当します。

于 2011-07-14T15:42:14.350 に答える