java向mysql插入数据乱码问题的解决方法

遇到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编码运行,连接MySQL数据库时使用utf8编码
停止和重新启动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编码

从第三条记录我们可以看到现在程序连接数据库时可以正常的添加和显示中文了

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的话就不必了,同时修改客户端的编码之后程序依然能够正常显示(以上两点已经测试)

所以如果在程序中要显示中文的话我们可以选用utf8,gb2312,gbk这三种编码,但是如果想在命令行添加中文数据或者查看的话就需要将客户端的编码设置为gb2312或gbk了,还是那句,CMD的编码有关。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-09-19

解决Java程序使用MySQL时返回参数为乱码的示例教程

先说MySQL的字符集问题.Windows下可通过修改my.ini内的 default-character-set=utf8 //客户端的默认字符集 在MySQL客户端工具中输入 SHOW VARIABLES LIKE 'character%'; 显示如下 这样执行读取信息返回中文为乱码,解决办法是,在连接数据库之后,读取数据之前,先执行一项查询 SET NAMES 'utf8'; 即可显示正常. 最简单的完美修改方法,修改mysql的my.cnf文件中的字符集键值(注意配置的字段细节): 1.

java连接mysql数据库乱码的解决方法

解决方法一: mysql安装时候的编码, 看下my.ini,有无 复制代码 代码如下: [mysql] default-character-set=utf8 [client] default-character-set=utf8 [mysqld] default-character-set=utf8创建表的时候设置: DROP TABLE IF EXISTS `Company`; CREATE TABLE IF NOT EXISTS `Company` ( `Cname` VARCHAR(10)

php无法连接mysql数据库的正确解决方法

即使连接Mysql的语句正确,php也无法连接mysql数据库,出现如下图所示的结果: 首先是在Apache服务器的conf/httpd.conf下的任意位置都没有:PHPIniDir "php压缩目录"这一项. 如"C:/php-5.4.43-Win32-VC9-x86是php的压缩目录,应该有PHPIniDir "C:/php-5.4.43-Win32-VC9-x86" 之后,需要把php压缩目录,与php压缩目录/ext添加到环境变量Path值中.

PHP远程连接MYSQL数据库非常慢的解决方法

不知道如何解决,所以把他空间所在的服务器上也装了个MYSQL,才解决问题,今天又有个这个问题,不能也在这服务器上装一个MYSQL吧,Search: PHP远程连接MYSQL速度慢,有时远程连接到MYSQL用时4-20秒不等,本地连接MYSQL正常,出现这种问题的主要原因是,默认安装的MYSQL开启了DNS的反向解析,在my.ini(WINDOWS系统下)或MY.CNF(UNIX或LINUX系统下)文件的[mysqld]下加入skip-name-resolve这一句,保存. 开始-->运行-->

java连接mysql数据库及测试是否连接成功的方法

本文实例讲述了java连接mysql数据库及测试是否连接成功的方法.分享给大家供大家参考,具体如下: package com.test.tool; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement

Java连接mysql数据库并进行内容查询的方法

最近用框架做了几个项目,感觉当初底层的东西有点忘了,写一个JDBC的简单的连接代码来熟悉回顾一下,也希望对刚接触的新手能有所帮助.这也是我的第一篇随笔,废话不多说,直接上代码: public Connection getCon() { //数据库连接名称 String username="root"; //数据库连接密码 String password=""; String driver="com.mysql.jdbc.Driver"; //其中

Java连接MySQL数据库增删改查的通用方法(推荐)

运行环境:eclipse+MySQL 以前我们Java连接MySQL数据库都是一个数据库写一个类,类下面写好多方法,要是多个数据库,就要写多个类多个方法,导致代码编写太过于繁琐,所以为了改变这样的繁琐,我将连接数据库的方法进行了一系列的封装,使用户传入一个对象值Object就可以得到想要的. 我在之前写过一篇普通的Java连接MySQL数据库,大家可以看看,以便对比参考之后就知道差距了 数据库--MySQL-->Java篇 接下来我给大家讲讲如何将这个不可复用,又多重复的连接代码,封装起来,非常

bitronix 连接 MySQL 出现MySQLSyntaxErrorException 的解决方法

bitronix 连接 MySQL 出现MySQLSyntaxErrorException 的解决方法 1. 开发环境 hibernate 版本:5.1.0.Final Bitronix btm 版本:2.1.3 2 异常堆栈信息 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Access denied for user ''@'localhost' to database 'hibernate' at

java连接mysql数据库实现单条插入和批量插入

本文实例为大家分享了java连接mysql数据库实现单条和批量插入的具体代码,供大家参考,具体内容如下 本文插入数据库的数据来源:java + dom4j.jar提取xml文档内容 1.连接数据库 package com.njupt.ymh; import java.sql.DriverManager; import java.sql.SQLException; import com.mysql.jdbc.Connection; public class Connect_MySQL { priv

Java连接Mysql数据库详细代码实例

这篇文章主要介绍了Java连接Mysql数据库详细代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 隔了一段时间没连过数据库,代码都忘记了,网上看了下挺乱的,还是自己记录下好.这里的代码主要是连接数据库和显示数据,没有具体的数据库操作. 首先第一步当然是导入mysql的jar包,在java文件中创一个新的文件夹,我这里命名为lib,然后把jar包复制进去 然后右键jar包,选择build path将包添加进库中 之后就是代码实现了 pac

Java连接mysql数据库的详细教程(推荐)

该教程是面向那些不知道如何通过java连接mysql数据库的新手,所以该教程用的方法不是最优的方法,但求是最好理解的方法. 需要的工具: eclipse.mysql.mysql的驱动 mysql驱动链接:mysql-connector-java-5.1.7.zip 如果该链接下载不了的话,可以私信我 1.在eclipse中创建一个工程:jdbc 2.在工程下创建lib文件夹 鼠标右键点击jdbc工程 --> New -->Folder. 文件夹命名为lib 3.导入mysql驱动 解压上述连接