JDBC 连接 MySQL 中文乱码问题

JDBC 连接 MySQL 中文乱码问题

前言

最近在写小项目,用到了上个月刚学的mysql和 JDBC,在java查询时出现了中文乱码,在网络上查询资料,发现相关问题比较混乱,故整理一下解决方法。

原因

字符集不匹配

运行环境

  • MyEclipse2014
  • JDK1.7
  • mysql-connector-java-5.1.47
  • MySQL5.7
默认字符集 内容
MySQL Latin1(ISO-8859-1) 单字节编码,向下兼容ASCII
MyEclipse2014 GBK(汉字内码扩展) 双字节编码,向下兼容GB 2312,向上支持 ISO 10646
通用 UTF-8(万国码) 可变长度字符编码,兼容ISO-8859-1,兼容ISO 10646

所以把运行环境的字符集格式统一就行了吗,太天真了→_→

解决方法

MyEclipse

对于MyEclipse的字符集修改在项目的属性里
JDBC 连接 MySQL 中文乱码问题_第1张图片
这个操作是要在项目创建时就进行,不能在编写代码后进行,不然中文注释就乱码了o(╥﹏╥)o

一劳永逸的解决方法是对整个MyEclipse的默认字符集进行修改
Window——perferences

JDBC 连接 MySQL 中文乱码问题_第2张图片
当然,你可以搜索encoding将所有字符集都修改一下(不推荐)
JDBC 连接 MySQL 中文乱码问题_第3张图片JDBC 连接 MySQL 中文乱码问题_第4张图片

MySQL(重点

MySQL的编码修改是坑最多的

如果你查资料会找到一个SQL语句show variables like '%char%'用来查看字符集

JDBC 连接 MySQL 中文乱码问题_第5张图片

解释
character_set_client 设置客户端字符集
character_set_connection 设置连接字符集
character_set_database 设置数据库默认字符集,character_set_database显示的和character_set_server一致
character_set_filesystem 把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem,默认binary是不做任何转换的
character_set_results 设置结果字符集
character_set_server 设置服务器字符集
character_set_system 设置系统字符集
character_set_dir 设置字符集安装目录

修改语句为set character_set_XXXX=XXXX;
JDBC 连接 MySQL 中文乱码问题_第6张图片你以为到这就结束了吗,不真正的坑出现了

当你关闭当前查询,使用JDBC时发现,还是乱码,回头一看,一切又被改回来了o(╥﹏╥)o

治标还要治本

前面的更改只在那个Session(会话)中,相当于临时修改,要永久修改还要修改mysql配置文件
C:\ProgramData\MySQL\MySQL Server 5.7\my.ini中的字符集设置

一共两处
[mysql]下面的default-character-set,将注释#去掉,加上你要字符集
[mysqld]下面的character-set-server同理

然后重启mysql服务,就行了
JDBC 连接 MySQL 中文乱码问题_第7张图片
虽然这样就可以,统一字符集

不过在写连接字符串时还是要加上参数
jdbc:mysql://127.0.0.1:3306/game?useUnicode=true&characterEncoding=UTF-8

保险一些

总结

虽然一般操作数据库都是用框架,配置简单,但使用底层接口操作,遇到的麻烦更能锻炼人,更能深入底层,分析背后的变化,对基本功要求更高。

你可能感兴趣的:(问题,JAVA)