遇到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的编码有关。

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

java mysql 插入 乱码_java向mysql插入数据乱码问题的解决方法相关推荐

  1. java 设置400错误_Java项目报400错误的原因与解决方法

    java项目中400错误介绍:(推荐:java视频教程) 400 Bad Request: 请求中的语法错误.Reason-Phrase应当标志这个详细的语法错误,比如"Missing Ca ...

  2. mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法

    mysql出现ERROR1698(28000):Access denied for user root@localhost错误解决方法 参考文章: (1)mysql出现ERROR1698(28000) ...

  3. mysql没法安装_mysql没法使用、没法启动服务的解决方法

    前提:是Windows系统mysql 1.考虑是否和之前下载的数据库冲突sql 解决方法:数据库 删除一切安装过的SQL安全 删除注册表(运行->regedit),machine->sys ...

  4. vi的插入模式下退格和方向键不能使用的解决方法

    vi的插入模式下退格和方向键不能使用的解决方法 安装vim full 版本: $sudo apt-get remove vim-common $sudo apt-get install vim

  5. mysql 闪回_MySQL数据误删除的快速解决方法(MySQL闪回工具)

    概述 Binlog2sql是一个Python开发开源的MySQL Binlog解析工具,能够将Binlog解析为原始的SQL,也支持将Binlog解析为回滚的SQL,去除主键的INSERT SQL,是 ...

  6. MySQL出现Incorrect integer value: ‘‘ for column ‘id‘ at row 1解决方法

    MySQL出现Incorrect integer value: '' for column 'id' at row 1解决方法 参考文章: (1)MySQL出现Incorrect integer va ...

  7. mysql数据库表字段使用DESC等关键字报错及解决方法

    mysql数据库表字段使用DESC等关键字报错及解决方法 参考文章: (1)mysql数据库表字段使用DESC等关键字报错及解决方法 (2)https://www.cnblogs.com/li--xi ...

  8. u盘插在电脑上灯亮没有反应_Win7系统插入U盘指示灯亮但电脑不显示的解决方法【图】...

    Win7系统插入U盘指示灯亮但电脑不显示的解决方法分享给大家,u盘可以非常方便的传输和储存文件,深受广大用户的喜爱,几乎人手必备一个!但是关于u盘的问题也有很多,比如有些用户反映,当在win7系统中插 ...

  9. MySQL ERROR 1017 Can’t find file ‘xxx.frm’…错误的解决方法

    MySQL ERROR 1017 Can't find file 'xxx.frm'-错误的解决方法 有的时候发现MySQL数据库某些表出现如下错误: ERROR #1017 :Can't find ...

  10. U盘插入有响应但找不到U盘的解决方法

    U盘插入有响应但找不到U盘的解决方法: 通知栏找到U盘,右键打开打印机,删除你的U盘 拔出U盘再插入 相当于重新安装驱动

最新文章

  1. HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。...
  2. mysql 无限长度,如何将varchar设置为无限长度?
  3. QT的QRenderPass类的使用
  4. 《C4.5: Programs for Machine Learning》chaper4实验结果重现
  5. Android成长日记-Android布局优化
  6. centos mysql无法启动 sock_linux下mysql无法启动的解决方法
  7. 页面显示问题用layer插件
  8. 顺应大数据时代创新社会治理模式
  9. 2019.7.26随堂笔记
  10. 字符————ASC II码
  11. 如何快速提取pdf中矢量图
  12. 在商业化这件事上,百度Apollo智能车联究竟做得怎么样了?
  13. 2022.04.17(LC_6070_计算字符串的数字和)
  14. 医保业务综合服务终端技术规范_增值税发票综合服务平台出口退税业务操作指引...
  15. The early bird catches the worm!
  16. Re: 客户协作 OVER 合同谈判
  17. 微生物群落的circos图怎么画_微生物群落分析
  18. 数字逻辑——触发器的选用和使用注意事项
  19. 访问项目无法访问 此网站192.168.*** 拒绝了我们的连接请求。
  20. mysql学习笔记---存储过程和函数①

热门文章

  1. “我的国产数据库之路”征文活动——专访优秀作者彭冲
  2. 邀请函丨云和恩墨邀您一起迈向混合数据库时代!
  3. 数据库每日一题 2020.04.30
  4. 学会这5种JS函数继承方式,前端面试你至少成功50%
  5. AI论文解读丨融合视觉、语义、关系多模态信息的文档版面分析架构VSR
  6. CoralCache:一个提高微服务可用性的中间件
  7. 基于Fabric的性能测试与调优实践
  8. 为什么11·11物流一年比一年快?奥秘就在这里!
  9. 大型情感剧集Selenium:6_selenium中的免密登陆与cookie操作 #华为云·寻找黑马程序员#
  10. ls -l的功能是什么linux,Ls - Linux Wiki