专栏首页源懒由码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的编码有关

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java向数据库中插入中文出现乱码

    引用 http://www.cnblogs.com/jack204/archive/2012/09/11/2680106.html

    forxtz
  • 配置压缩版mysql 5.7以上版本

    在MySQL的安装目录(例如我的是D:\Program Files\mysql-5.7.10-winx64)下,建立新文本文件txt,并将其命名为my....

    forxtz
  • 爬虫模拟登录破解无原图滑动验证码

    大体思路:以前的滑动验证码多为有原图的验证码,可以通过Image模块截取两张不同的图,通过对比像素得出移动的距离,无原图验证码也是基于这个原理,只是多了一步找出...

    forxtz
  • Centos7 安装 Mysql 数据库

    因为安装后,会自动给 root 生成默认密码的,我们用下面命令查看密码,5ejRwZBgquL就是默认密码了。

    ppjun
  • Ubuntu的MySQL中文乱码问题--自己躺坑

    最近一段时间学习Django,在进行与MySQL数据联合使用的插入数据的时候遇到下边的问题:

    静默加载
  • CentOS6.5修改MySql5.7中文编码问题

    Coxhuang
  • 查看及修改mysql数据库编码

    show variables like '%char%'; 二、查看MySQL数据表(table)的MySQL字符集。

    汐楓
  • Mysql设置UTF-8字符集

    [windows下安装mysql及设置字符集]http://blog.csdn.net/dream_an/article/details/51058710

    王小雷
  • mysql操作命令梳理(4)-中文乱码问题

    在平时的mysql运维操作中,经常会碰到插入中文字段后出现乱码的情况,产生中文乱码的原因一般有: 1)mysql的编码格式不对,是latin1编码。强烈推荐将m...

    洗尽了浮华
  • 设计模式-工厂模式

    cwl_java

扫码关注云+社区

领取腾讯云代金券