5

私はNetbeansを使用して、ヘブライ語フィールドを持つデータベースを処理するJava、JSPを使用してWebアプリケーションを構築しています。

DDLは次のとおりです。

String cityTable = "CREATE TABLE IF NOT EXISTS hebrew_test.table ("
                            +"id int(11) NOT NULL AUTO_INCREMENT,"
                            +"en varchar(30) NOT NULL,"
                            +"he varchar(30) COLLATE utf8_bin NOT NULL,"
                            +"PRIMARY KEY (id)"
                            +") ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;";
String insert = "INSERT INTO hebrew_test.table (en, he) VALUES ('A','a')";
String insert2 = "INSERT INTO hebrew_test.table (en, he) VALUES ('B','ב')";
String insert3 = "INSERT INTO hebrew_test.table (en, he) VALUES ('C','אבג')";


executeSQLCommand(cityTable);
executeSQLCommand(insert);
executeSQLCommand(insert2);
executeSQLCommand(insert3);

私が得る出力テーブル:

1   A   a
2   B   ?
3   C   ???

それ以外の:

1   A   a
2   B   ב
3   C   אבג

Netbeansでヘブライ語が疑問符として表示されることを試しましたが、それは同じ問題ではありません。表に疑問符が表示されます。

UTF8_binまた、上記のコードでわかるように、テーブルをに定義しました。

4

2 に答える 2

7

SQLクエリを表す文字をバイトにデコードするときにUTF-8エンコーディングを使用するようにJDBCドライバに指示する必要があります。これを行うには、JDBC接続URLにパラメーターを追加useUnicode=yesしてクエリを実行します。characterEncoding=UTF-8

jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8

それ以外の場合は、オペレーティングシステムプラットフォームのデフォルトの文字セットを使用します。MySQL JDBCドライバー自体は、クライアント側(JDBCコードが実行される場所)とサーバー側(DBテーブルがある場所)の両方で使用されるエンコーディングを十分に認識しています。DBテーブルで使用される文字セットでカバーされていない文字は、疑問符に置き換えられます。

参照:

于 2013-01-02T02:37:40.707 に答える
2

値をSQLに直接含めています。それは常に悪い考えです。パラメータ化されたSQLを使用しPreparedStatement、値をパラメータとして設定します。問題が解決しない場合もありますが、とにかくパラメーター化されたSQLを使用する必要があるため、これが最初に試みることです。(パラメーター化されたSQLは、SQLインジェクション攻撃を回避し、コードをデータから分離し、不要な変換を回避します。)

次に、問題が実際に発生している場所を正確に特定する必要があります。

  • 挿入しようとしている値が正しいことを確認してください。
  • 取得する値が正しいことを確認してください。
  • Wiresharkを使用してWeb応答の内容を確認します-宣言されたエンコーディング実際のデータの内容を確認します

値を確認するときは、文字列内の各文字を繰り返し処理し、値をUTF-16コード単位として出力する必要があります(ループで使用toCharArray()または使用)。charAt()値をコンソールに出力するだけでは、他の問題が発生する可能性が高くなります。

編集:私がこれを答えとして書いた理由の少しの文脈のために:

  • 私の経験では、SQLに直接ではなく、パラメーターとして文字列値を含めることで、このような問題を回避できる場合があります(もちろん、セキュリティ上の理由などからも優れています)。
  • 私の経験では、問題がデータベース側にあるのかWeb側にあるのかを診断することも重要です。この診断は、文字列だけでなく、使用されている正確なUTF-16コードユニットをログに記録することによって行うのが最適です(そうしないと、ログ記録またはコンソール出力中にさらにエンコードの問題が発生する可能性があります)。
  • 私の経験では、このような問題は、コードパスの挿入または読み取りのいずれかで簡単に発生する可能性があります。

これはすべて、コメントのような詳細情報の要求だけでなく、OPを前進させる方法として重要です。

于 2013-01-01T18:18:38.437 に答える