9

utf8すべてのテーブルの文字セットを持つ mysql データベースがあります。SQLDeveloper を使用して、最新の JConnector JDBC ドライバーでデータベースにアクセスしてクエリを実行しています。

ブルガリア語を含むSELECT 'Варна';と同等の単純なクエリを実行すると、SQLDeveloper は を返します。これにより、ブルガリア語を使用したデータベースからの選択が returnになります。これは、それらの句 (ブルガリア語を含む)がデータベース内のブルガリア文字と一致しないためです。(選択でブルガリア語がまったく使用されていない場合、SQLDeveloper は完全に正しい値を返し、クエリの結果として返されたブルガリア語を正しく表示します。)SELECT 'Варна' from DUAL;'?????'NULLwhereuft8

Preferences -> Environment -> EncodingSQLDeveloperのは現在 に設定さUTF-8れていますが、そこにリストされている適用可能なエンコーディングを事実上すべて試しましたが、最も単純なクエリでさえSELECT 'Варна' from DUAL;正しい値を返しませんВарна

NLS_LANGこれが原因かもしれないと考えて、変数の設定を調べましたが、役に立ちませんでした。(おそらくそれが鍵ですが、実際に適切に構成することはできません)。

編集:問題を再現して視覚化するには(説明が不十分だった可能性があることに気づきました)、SQLDeveloperに移動してmysqlデータベースに接続し、クエリを実行しますSELECT 'Варна' from DUAL;

Edit2: 説明。

Edit3: @tenhouse が残したコメントが示すように、これはバグである可能性があります。

Edit4: 以下にコメントとして記載されているように、上記のクエリは、SELECT 'Варна' from DUAL;MySQL Workbench で変更や設定をいじることなく、完全に正常に機能します。

編集 5: 問題に対する回答がまだないため、何か改善できると思われる場合は、タイトルやタグを自由に修正してください。

Edit6: これは本当にバグだと思いますか? 正確に報告する場所を誰か教えてもらえますか - それは JConnector または SQLDeveloper 関連のバグですか? SQLDeveloper のバグとして報告する必要があると思いますが、時間を無駄にする前に確認を取りたいと思います。

Edit7:答えを期待して、さらに明確にしようとしました。

Edit8: (重要!)現在のデータベースは Linux (Ubuntu 12.04、MySQL 5.5.28) サーバーでホストされています。ただし、新しい Windows マシンに MySQL をインストールしてutf8そこにデータベースを作成すると、SQLDeveloper を介したクエリは想定どおりに機能し、SELECT 'Варна' from DUAL;実際にはВарна. 誰かがこれを確認してもらえますか?

4

4 に答える 4

1

したがって、数か月前にこの問題が発生するまで、私自身はこれを知りませんでしたが、MySQL は実際には、クライアント、データベース、および接続に対してさまざまなエンコーディングの機能を提供しています。MySQL は、クライアントから/への要求/応答を、クライアントまたはクライアントの構成ファイルで指定された別のエンコーディングに変換 (または照合) します。したがって、データベースが utf8 として保存していても、クライアントが latin1 に設定されている場合、結果のエンコーディングとして latin1 が表示されます。これを確認する最も簡単な方法は、MySQL への接続を開始し、次のクエリを実行することです。

SHOW VARIABLES LIKE "%char%";

さまざまな接続/ソースのエンコーディングが多数表示されるはずです。あなたの説明から、これらのほとんどはutf8ではないと思います。これらのそれぞれが何を意味するかについてのmysql のドキュメントを次に示します。SET NAMES 'utf8';を実行することで、これが実際に問題であるかどうかをテストできます。またはcharset utf8; (どれを思い出せません)クエリを再度実行して、問題が解決するかどうかを確認してください。

これらの各人が何をするかの要約(ドキュメントにはいくつかのものが省略されているため):

  • character_set_client:クライアントからサーバーに送信する際のデータのエンコード方法を指定します。MySQL の API を介して接続するものはすべてクライアントではありません(例: php の mysqli、ほとんどの C/C++ ラッパー ライブラリ)
  • character_set_database:データベースに格納されるデータのエンコーディングを指定します
  • character_set_filesystem:よくわかりませんが、データはどのようにディスクに書き込まれるのでしょうか?
  • character_set_results: MySQL がクエリ結果を返すエンコーディング
  • character_set_server:サーバーのデフォルト セット (これが使用されるケースはよくわかりません)
  • character_set_system:これもよくわからない
  • character_sets_dir:照合/エンコーディングの定義がある場所

これらの人たちのほとんどは、my.cnf を編集してそこにデフォルトを貼り付けることで指定できます。

JConnector がどのように機能するかは正確にはわかりませんが、MySQL の C API を使用していると思います。その場合、コードのどこかで次のようなことを行う必要があります。おそらく、JConnector には、彼を通じてこれを設定する方法があります。よくわかりませんが、MySQL API の構文は次のとおりです。

mysql_options( myLink, MYSQL_SET_CHARSET_NAME, "utf8" );

編集: MySQL 5.5の場合

于 2013-01-16T15:29:29.227 に答える
0

次のようなコマンドを試すことができます :: ALTER DATABASE CHARACTER SET WE8ISO8859P5;

文字セットを変更した後、DBを再起動してください。

詳細については、さまざまな言語に必要なエンコーディングについて説明しているこのリンクを参照してください。

http://www.csee.umbc.edu/portal/help/oracle8/server.815/a67789/ch3.htm

于 2012-12-05T10:17:58.503 に答える
0

mysql_connect で接続した後:

$dbcnx = mysql_connect($dbhost, $dbuser, $dbpass)

次のクエリを実行します。

mysql_query("SET 
                  character_set_results = 'utf8', 
                  character_set_client = 'utf8', 
                  character_set_connection = 'utf8', 
                  character_set_database = 'utf8', 
                  character_set_server = 'utf8'", 
    $dbcnx);

これで、返される内容、サーバーで発生する内容のエンコーディングが設定されるため、すべてが同じエンコーディングになります。

次のクエリでは、この接続を使用するように指定します

于 2013-02-08T09:07:34.953 に答える