最近接触使用MyEclipse写代码向Mysql插入记录,一直遇到插入记录乱码的问题,为了解决乱码问题,花了很多时间,查询了很多资料,现在问题总算初步解决,在这里简单总结一下。
通常的解决办法主要有以下几种:
JAVA部分
1、修改Connection接口中的url部分,添加强制UTF-8要求:
datasource.setUrl("jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=UTF-8");
即在数据库后添加useUnicode和characterEncoding配置
2、将需要插入的数据内容进行UTF-8强制转换
sql=new String(sql.getBytes("GB2312"),"UTF-8");
3、在MyEclipse里点击Windows->Prefrences->General->Editors->Text Editors->Spelling->Encoding other UTF-8。如果在JAVA中直接写入汉字,可以避免乱码。不过我使用的是:右键对应工程->Properties->Resource->Text File Encoding->other UTF-8。提前将文件强制转换为UTF8格式,达到了同样的效果
Mysql部分
Mysql部分的操作很简单,直接修改my.ini文件即可,早期Mysql版本支持使用安装后的配置操作完成UTF-8的配置,但是较新的版本目前看只能通过文件设置,安装完成后并不存在my.ini文件,需要手动拷贝my-default.ini文件,添加以下语句:
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[mysqld]
#设置3306端口
port = 3306
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
添加完成后,在控制台输入MySQL -uroot -p并输入密码后登陆,执行status,出现如下显示,表示配置成功:
好了,照理说都配置好了录入数据库应该不会是乱码了,可每次输入中文还依然是乱码。。。
多次查询无果后,我开始自己输出中文到控制台,果然出现了问题,所有通过Scanner录入的汉字,打印到控制台的时候,全都成了乱码,所以说到底不是MySQL与MyEclipse之间的兼容问题,需要找控制台的输入原因。经过了一顿好找,总算发现了原因,当下面设置:右键工程->Properties->Resource->Text File Encoding->other
UTF-8成立时,控制台的输入即为乱码,但设置为
GBK时,控制台反而可以正常显示。由此可见,通过Myeclipse配置,控制台能够将输出格式设定为UTF-8,但是由于操作系统编码为GBK,所以录入汉字时,系统默认按GBK录入,但存储和展示时却按照UTF-8格式进行翻译,编码不一致导致了乱码的发生。
知道了问题的解决方法,通过使用JAVA修改的第二条应该就可以解决上述问题,可惜实际上并没有。。。
原来是由于GB2312不能向下兼容更新的GBK(反之可以),此时只需要把代码修改为:
sql=new String(sql.getBytes("GBK"),"UTF-8");
现在乱码问题总算是解决了。
乍一看上边的函数实现了编码的转换,但是为什么如此书写能够实现相关功能呢?下面简单讲解一下:
假设GBK编码为A(x),UTF-8编码为B(x),我们要录入的中文为Y,这时通过转码,我们可以得到中文对应的字节编码:
a=A-(Y) b=B-(Y)
A(a)=B(b)=Y
在本例中,当我们录入中文Y时,控制台将数据保存为a,使用getBytes("GBK")会将a翻译为Y并编码为系统默认的二进制格式,虽然实际内容可能仍然是a,不过既然是系统默认的格式,那么就可以进行转码操作,通过String的构造函数
String(byte[] bytes,
Charset charset) ,将a直接映射为b,这样,最终编码为UTF-8,解码及显示也为UTF-8,就不会出现乱码了
虽然问题得到了解决,可是结果仍然不能令人满意,我们需要每次都将控制台输入的字符串进行重新编码,既增加了工作成本,也容易出现疏漏,怎么才能直接让输入的字符串能够通过UTF-8的方式录入呢?原来在这个地方进行设置:
这个设置违背常理,我们的代码和数据库都是UTF-8格式的,如果设置编码方式为GBK,反而不会出现乱码,这又是怎么回事呢?
原来,通过设置输入默认的GBK格式,使得操作系统控制台和MyEclipse完成了兼容,这时系统反而能够正常识别出输入的编码,在写入MySQL时,转码机制才能够启动,使用上述设置后,我们再也不需要使用String的强转功能,也能够顺畅的进行控制台录入了~~~