保存しようとすると、mysql データベースñ
になります。?
いくつかの読み取りの後、jsp charset を に変更する必要があることが示唆されましたUTF-8
。いくつかの理由で、私は固執する必要がありISO-8859-1
ます。私のデータベース テーブルのエンコーディングはlatin1
. どうすればこれを修正できますか? 助けてください。
6 に答える
MySQL WorkBench
たとえば、エンジンをInnoDB
に、照合をに配置して、データベース管理に移動しますutf8-utf8_general_ci
。
質問の中で、ISO-8859-1 バックエンド (latin1) と Unicode (UTF-8) フロントエンドが必要であると述べています。フロントエンドのセットがデータベースで許可されているものよりもはるかに大きいため、このセットアップはクレイジーです。最も健全なことは、ソフトウェア スタックを介して同じエンコーディングを使用することですが、ストレージにのみ Unicode を使用することも理にかなっています。
ご存じのとおり、文字列は一連の文字に対する人間の概念です。コンピュータ プログラムでは、文字列はそうではありません。文字のシーケンスとして表示できますが、実際にはバイト ストリームとエンコーディングのペアのデータ構造です。
String を渡すことは、実際にはバイトとスキームを渡すことだと理解したら、誰が何を送信するかを見てみましょう。
- ブラウザから HTTP サーバーへ (通常はフォーム ページと同じエンコーディングであるため、UTF-8 です。スキームは で指定されます。欠落している場合、サーバーは独自の戦略
Content-Type
に基づいて 1 つを選択します。たとえば、デフォルトは ISO-8859-1 または構成です)。パラメータ) - HTTP Server to Java プログラム (Java to Java であるため、文字列オブジェクトを渡すため、エンコーディングは関係ありません)
- 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 のバージョン)
データベース テーブルのコンテンツ エンコーディングを 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;
テーブルの照合を次のように変更しますutf8_spanish_ci
whereñ
は等しくありませんn
が、両方の文字を等しくしたい場合は使用します
utf8_general_ci
代わりは