问题描述:
1、在命令行中进行插入,没有问题。但是显示存在部分乱码
2、在JDBC中插入成功、中文是直接以“??”形式显示。
通过Navicat客户端查看
与在网页中看到的一一致,说明读取没有问题,问题定位在写入数据或存储数据的编码有问题。
解决方案:
当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12','Sales',2000,'是个好员工!'); 出现乱码时,使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集。
可以看到 MySQL 有六处使用了字符集,分别为:client 、connection、database、results、server 、system。其中与服务器端相关:database、server、system(永远无法修改,就是utf-8);与客户端相关:connection、client、results 。保证每一项的编码统一就不会产生乱码,当然支持中文的话也可以改成gbk,gb2312,utf-8等,建议是utf-8。在mysql中默认字符集是latin1,他是不支持中文的
client |
为客户端使用的字符集。 |
connection |
为连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型则按照服务器端默认的字符集设置。 |
database |
为数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。 |
results |
为数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。 |
server |
为服务器安装时指定的默认字符集设定。 |
system |
为数据库系统使用的字符集设定。 |
与客户端相关:connection、client、results 。字符集可以通过set names utf8; 或者 set names gbk;进行修改数据库的编码集。
设置完成后即可解决客户端插入数据或显示数据的乱码问题了,但我们马上会发现这种形式的设置只会在当前窗口有效,当窗口关闭后重新打开 CMD 客户端的时候又会出现乱码问题;那么,如何进行一个一劳永逸的设置呢?在 MySQL 的安装目录下有一个 my.ini 配置文件(Linux下是/etc/my.cnf),通过修改这个配置文件可以一劳永逸的解决乱码问题。在这个配置文件中 [mysql] 与客户端配置相关,[mysqld] 与服务器配置相关。默认配置如下:
- [mysql]
- default-character-set=utf8
- [mysqld]
- character-set-server=utf8
修改完成后,我重启了Linux,主要的server 已经改为utf8了。
设置后,从JDBC进行增加的数据、显示出来没有问题了。
tip:不同MySQL版本修改设置项还不同:
在5.1版本时,为了解决中文乱码问题设置默认字符集为utf8时,是写:
default-character-set=utf8
到了5.5版本, [mysql] 项内可以这么写, [mysqld] 项内这么写在启动MySQL服务时会有1067错误,经查询发现这里必须要这样写:
character-set-server=utf8
set names 命令其他试探:
当使用了set names gbk后使用insert后出现乱码,而默认写入编码格式是utf8,所以直接就进行写入没有问题。
得出结论:server编码是数据库最终存储数据的编码格式,而set names命令只修改了写入数据时的数据编码格式。