しばらく前にJDBCを学び、MySQLに接続してデータを取得しました。教師のサンプルデータによると、名前などの情報を保存する必要がありましたが、それらはすべて英語でした。当時は英語を使いたくなかったので、ルームメイトの名前を保存しました。その結果、何かがうまくいかなかった。
データベースステートメントに接続します:
静的な最終文字列db_url = "jdbc:mysql:// localhost/filemanagement";
クエリステートメント:
private static final string theuserquery = "name =??
私は自分の名前をクエリ、nullpointerexceptionで使用しています。私の名前に対応するデータが見つからなかったことは明らかであり、データベースに存在します。なぜこれがなぜですか?
Baiduからの答えは、中国の文字化けコードです。解決策は、接続データベースステートメントを以下に変更することです。
静的最終文字列db_url = "jdbc:mysql:// localhost/filemanagement?useunicode = true&charatereCoding = gbk";
もう一度やり直してください!
大丈夫です!しかし、なぜこれはなぜですか?これらの2つのパラメーターは何ですか?なぜそれを追加した後に問題を解決したのですか?
これらの2つのパラメーターは、次のように説明されています。
両方のパラメーターのデフォルト値はfalseです。言い換えれば、MySQLを接続するときに接続に使用される文字セットを指定すると、すべてが正常です。しかし、私はまだメカニズムについてあまり知りませんので、私はそれをチェックし続けます。
MySQL接続がクエリやその他の操作を実行すると、文字セット変換プロセスがあることがわかります。
1。MySQLServerがリクエストを受信したら、RequestデータをCharacter_Set_ClientからCharature_Set_Connectionに変換します。
2。内部操作を実行する前に、要求されたデータを文字_set_connectionから内部操作文字セットに変換します。決定方法は次のとおりです。
•各データフィールドの文字設定値を使用します。
•上記の値が存在しない場合は、対応するデータテーブルのデフォルトの文字設定値(MySQL拡張子、非SQL標準)を使用します。
•上記の値が存在しない場合、対応するデータベースのデフォルトの文字設定値が使用されます。
•上記の値が存在しない場合は、character_set_serverを使用して値を設定します。
3。操作の結果を、内部操作文字セットからCharacter_set_Resultsに変換します。
これらのキャラクターセットは何を表していますか?
Chariture_set_server:デフォルトの内部操作文字セット
character_set_client:クライアントソースデータで使用される文字セット
Character_set_connection:接続レイヤー文字セット
character_set_results:query result result文字セット
Chariture_set_database:現在選択されているデータベースのデフォルト文字セット
character_set_system:システムメタデータ(フィールド名など)文字セット
また、いくつかの一般的な質問を見つけました。それらは私のものとは異なりますが、彼らは素晴らしい参照値です。
•UTF8エンコードされたデータをデフォルトの文字セットでデータテーブルに挿入する前に、UTF8は接続文字セットがUTF8です。
挿入するとき、MySQL Serverのデフォルト設定に従って、Charature_Set_Client、Character_Set_Connection、Charature_Set_ResultsはLATIN1です。
挿入操作のデータは、LATIN1 => LATIN1 => UTF8の文字セット変換プロセスを通過します。このプロセス中に、挿入された各漢字は、元の3バイトから6バイトに保存されます。
クエリ中の結果は、UTF8 => UTF8の文字セット変換プロセスを通過し、保存された6バイトがそのまま返され、その結果、文字化けコードが生じます...
•UTF8エンコードされたデータをデフォルトの文字セットでデータテーブルに挿入する前に、接続文字セットをUTF8に設定します。
挿入するとき、character_set_client、character_set_connection、およびcharacter_set_resultsはすべてutf8です。
挿入データは、UTF8 => UTF8 => LATIN1の文字セットを介して変換されます。元のデータに /u0000〜 /u00ff範囲以外のUnicode文字が含まれている場合、「?」に変換されます。 (0x3F)ラテン語の文字セットで表現できないため、シンボル。将来、接続文字セットが設定されていても、そのコンテンツを復元することはできません。
(この部分はブラザーバードのブログから抜粋されており、リンクは後で添付されています)
データベースのテーブルはすべてUTF8エンコードで設定されていますが、最初に接続したとき、接続文字セットを設定しなかったため、デフォルトはLATIN1です。 UTF8 => LATIN1からの変換後、Carled Codeが生成されます。 GBKエンコーディングは2回目で使用しましたが、UTF8エンコーディングは使用しませんでした。なぜ大丈夫ですか?実際、それは同じことです。中国人はLATIN1エンコーディングではなく、GBKとUTF8では、問題はありません。
上記は、MySQLへのJDBC接続の文字化けの例外の解決策です。まだ質問がある場合は、以下のコメント領域で説明できます。