ホームページ >Java >&#&チュートリアル >mysql に挿入された文字化けしたデータに対する Java ソリューション

mysql に挿入された文字化けしたデータに対する Java ソリューション

黄舟
黄舟オリジナル
2017-09-21 10:03:471794ブラウズ

この記事は主に、Java が mysql に文字化けしたデータを挿入する問題の解決策を詳しく紹介します。興味のある友人は参考にしてください。

MySQLのデフォルトのエンコーディングはlatin1です

mysql> show variables like 'character%'; 
+--------------------------+--------------------------+ 
| Variable_name      | Value          | 
+--------------------------+--------------------------+ 
| character_set_client   | latin1          | 
| character_set_connection | latin1          | 
| character_set_database  | latin1          | 
| character_set_filesystem | binary          | 
| character_set_results  | latin1          | 
| character_set_server   | latin1          | 
| character_set_system   | utf8           | 
| character_sets_dir    | D:\MySQL\share\charsets\ | 
+--------------------------+--------------------------+

データテーブルを作成してデータを挿入します


mysql> use test; 
mysql> create table messages ( 
  -> id int(4) unsigned auto_increment primary key, 
  -> message varchar(50) not null
  -> ) engine=myisam default charset=utf8; 
mysql> insert into messages (message) values ("测试MySQL中文显示"); 
mysql> select * from messages; 
+----+-------------------+ 
| id | message      | 
+----+-------------------+ 
| 1 | 测试MySQL中文显示 | 
+----+-------------------+

プログラムを書く(Java)

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 
 
public class JDBCTest { 
  public static void main(String[] args) { 
    String driver = "com.mysql.jdbc.Driver"; 
    String url = "jdbc:mysql://localhost:3306/test"; 
    String user = "root"; 
    String password = "root"; 
 
    try { 
      Class.forName(driver); 
      Connection conn = DriverManager.getConnection(url, user, password); 
      Statement stmt = conn.createStatement(); 
      stmt.executeUpdate("insert into messages (message) values ('测试MySQL编码')"); 
      ResultSet rs = stmt.executeQuery("select * from messages"); 
      while (rs.next()) { 
        int id = rs.getInt("id"); 
        String message = rs.getString("message"); 
        System.out.println(id + " " + message); 
      } 
 
      rs.close(); 
      stmt.close(); 
      conn.close(); 
    } catch (Exception e) { 
      e.printStackTrace(); 
    } 
  } 
}

プログラムの出力


1 ?? ?? MySQL ????????

2 ??MySQL??
データベースを使用する場合は正常に中国語を追加して表示できますが、接続するプログラムを使用すると正常に中国語が表示されないことがわかります。これを行うには、MySQL のデフォルトのエンコーディングを変更する必要があります。my.ini (MySQL 構成ファイル) ファイルを編集してエンコーディングを変更します


MySQL のデフォルトの文字セットを utf8 に設定し、クライアント構成を見つけます [ client] を選択し、以下に追加します。

default-character-set=utf8

サーバー構成 [mysqld] を見つけて下に追加します

default-character-set=utf8

MySQL データベースを utf8 エンコーディングで実行するように設定し、utf8 を使用しますMySQL データベースに接続するときのエンコーディング

MySQL を停止して再起動します


net stop mysql
net start mysql
データベースに再接続し、エンコード、データ テーブルの内容を表示します

mysql> show variables like 'character%'; 
+--------------------------+--------------------------+ 
| Variable_name      | Value          | 
+--------------------------+--------------------------+ 
| character_set_client   | utf8           | 
| character_set_connection | utf8           | 
| character_set_database  | utf8           | 
| character_set_filesystem | binary          | 
| character_set_results  | utf8           | 
| character_set_server   | utf8           | 
| character_set_system   | utf8           | 
| character_sets_dir    | D:\MySQL\share\charsets\ | 
+--------------------------+--------------------------+ 
mysql> use test; 
mysql> select * from messages; 
+----+-------------------------------+ 
| id | message            | 
+----+-------------------------------+ 
| 1 | 虏芒脢脭MySQL脰脨脦脛脧脭脢戮       | 
| 2 | ??MySQL??           | 
+----+-------------------------------+

ここでの表示はまだ文字化けしています。主な理由は次のとおりです。以前に使用した別のエンコーディングを使用して、前に作成したプログラムを再実行します: java JDBCTest


1 ????MySQL?????

2 ??MySQL?? 3 MySQL コーディングをテストします


3 番目のレコードから、プログラムがデータベースに接続する際に中国語を正常に追加して表示できるようになったことがわかります。


mysql> select * from messages; 
+----+-------------------------------+ 
| id | message            | 
+----+-------------------------------+ 
| 1 | 虏芒脢脭MySQL脰脨脦脛脧脭脢戮       | 
| 2 | ??MySQL??           | 
| 3 | 娴嬭瘯MySQL缂栫爜         | 
+----+-------------------------------+

データベースの表示を振り返ると、なぜ表示されたのかを知ると非常に驚くでしょう。文字化けします。これは主に Windows のコマンド ラインに関連しています。エンコーディングに関しては、コマンド ラインのプロパティ -> オプションの現在のコード ページを確認してください: 936 (ANSI/OEM - 簡体字中国語 GBK) (これは方法です)私のマシンでは表示されています)

つまり、コマンドラインではGBKエンコーディングが使用されており、プログラムの接続時にutf8を使用して追加したため、文字化けが発生します。 次に、クライアントのエンコーディングをgb2312に変更しましょう。または gbk を試してみてください


mysql> show variables like 'character%'; 
+--------------------------+--------------------------+ 
| Variable_name      | Value          | 
+--------------------------+--------------------------+ 
| character_set_client   | gb2312          | 
| character_set_connection | gb2312          | 
| character_set_database  | utf8           | 
| character_set_filesystem | binary          | 
| character_set_results  | gb2312          | 
| character_set_server   | utf8           | 
| character_set_system   | utf8           | 
| character_sets_dir    | D:\MySQL\share\charsets\ | 
+--------------------------+--------------------------+ 
mysql> use test; 
mysql> select * from messages; 
+----+-------------------+ 
| id | message      | 
+----+-------------------+ 
| 1 | ????MySQL???????? | 
| 2 | ??MySQL??     | 
| 3 | 测试MySQL编码   | 
+----+-------------------+

これで、中国語が正常に表示されることがわかります (主に utf8 は中国語もサポートしているため)。コマンド ライン ツールを使用してデータベースに接続するときは、クライアントのエンコーディングを変更するのが最善です。 GUI を使用する場合、その必要はありません。同時に、クライアントのエンコーディングを変更した後でも、プログラムは通常どおり表示できます (上記 2 点はすでにテスト済みです)。したがって、プログラム内で中国語を表示したい場合は、次のようにします。 utf8、gb2312、gbk の 3 つのエンコーディングを選択できます。ただし、中国語データを追加したり、コマンドラインで表示したりする場合は、クライアントのエンコーディングを gb2312 または gbk に設定する必要があります。これは、CMD に関連しています。エンコーディング。

以上がmysql に挿入された文字化けしたデータに対する Java ソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。