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的字符集修改在项目的属性里
这个操作是要在项目创建时就进行,不能在编写代码后进行,不然中文注释就乱码了o(╥﹏╥)o
一劳永逸的解决方法是对整个MyEclipse的默认字符集进行修改
Window——perferences
当然,你可以搜索encoding将所有字符集都修改一下(不推荐)
MySQL(重点
)
MySQL的编码修改是坑最多的
如果你查资料会找到一个SQL语句show variables like '%char%'
用来查看字符集
解释 | |
---|---|
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时发现,还是乱码,回头一看,一切又被改回来了o(╥﹏╥)o
治标还要治本
前面的更改只在那个Session(会话)中,相当于临时修改,要永久修改还要修改mysql配置文件C:\ProgramData\MySQL\MySQL Server 5.7\my.ini
中的字符集设置
一共两处[mysql]
下面的default-character-set
,将注释#
去掉,加上你要字符集[mysqld]
下面的character-set-server
同理
然后重启mysql服务,就行了
虽然这样就可以,统一字符集
不过在写连接字符串时还是要加上参数jdbc:mysql://127.0.0.1:3306/game?useUnicode=true&characterEncoding=UTF-8
保险一些
总结
虽然一般操作数据库都是用框架,配置简单,但使用底层接口操作,遇到的麻烦更能锻炼人,更能深入底层,分析背后的变化,对基本功要求更高。