3

保存しようとすると、mysql データベースñになります。?いくつかの読み取りの後、jsp charset を に変更する必要があることが示唆されましたUTF-8。いくつかの理由で、私は固執する必要がありISO-8859-1ます。私のデータベース テーブルのエンコーディングはlatin1. どうすればこれを修正できますか? 助けてください。

4

6 に答える 6

5

MySQL WorkBenchたとえば、エンジンをInnoDBに、照合をに配置して、データベース管理に移動しますutf8-utf8_general_ci

于 2012-11-21T08:59:16.087 に答える
5

質問の中で、ISO-8859-1 バックエンド (latin1) と Unicode (UTF-8) フロントエンドが必要であると述べています。フロントエンドのセットがデータベースで許可されているものよりもはるかに大きいため、このセットアップはクレイジーです。最も健全なことは、ソフトウェア スタックを介して同じエンコーディングを使用することですが、ストレージにのみ Unicode を使用することも理にかなっています。

ご存じのとおり、文字列は一連の文字に対する人間の概念です。コンピュータ プログラムでは、文字列はそうではありません。文字のシーケンスとして表示できますが、実際にはバイト ストリームとエンコーディングのペアのデータ構造です。

String を渡すことは、実際にはバイトとスキームを渡すことだと理解したら、誰が何を送信するかを見てみましょう。

  1. ブラウザから HTTP サーバーへ (通常はフォーム ページと同じエンコーディングであるため、UTF-8 です。スキームは で指定されます。欠落している場合、サーバーは独自の戦略Content-Typeに基づいて 1 つを選択します。たとえば、デフォルトは ISO-8859-1 または構成です)。パラメータ)
  2. HTTP Server to Java プログラム (Java to Java であるため、文字列オブジェクトを渡すため、エンコーディングは関係ありません)
  3. Java クライアントから MySQL サーバーへ ( Connector/Jのドキュメントは非常に複雑です。システム変数を使用し、接続パラメーターcharacter_set_serverによって上書きされる可能性があります)characterEncoding

問題がどこにあるのかを理解するには、まず、列が実際に latin1 として格納されていることを確認します。

SELECT character_set_name, collation_name
    FROM information_schema.columns
    WHERE table_schema = :DATABASE
        AND table_name = :TABLE
        AND column_name = :COLUMN;

次に、リクエストから取得した Java 文字列をログ ファイルに書き込みます。

logger.info(request.getParameter("word"));

最後に、実際に列に何が表示されているかを確認します。

SELECT HEX(:column) FROM :table

この時点で、問題を理解するのに十分な情報が得られます。それが本当にクエスチョン マーク (置換文字ではない) である場合、MySQL が文字をより大きなセット (Unicode としましょう) からそれを含まないより狭いものにトランスコードしようとしている可能性があります。ここで奇妙なことに、ñ はISO-8859-1 (0xF1、10 進数 241) と Unicode (U+00F1) の両方に属しているため、往復に 3 番目の文字セット (おそらくコードページ?) が関係しているように見えます。 .

詳細情報が役立つ場合があります (オペレーティング システム、HTTP サーバー、MySQL のバージョン)

于 2012-11-21T13:17:59.450 に答える
3

データベース テーブルのコンテンツ エンコーディングを UTF-8 に変更します。

DB全体の変換のコマンドは次のとおりです

ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

そして、これは単一のテーブル変換用です

ALTER TABLE db_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
于 2012-11-21T08:55:37.793 に答える
3

テーブルの照合を次のように変更しますutf8_spanish_ci

whereñは等しくありませんnが、両方の文字を等しくしたい場合は使用します

utf8_general_ci代わりは

于 2012-11-21T08:55:39.093 に答える