解决Mysql乱码问题

       最近接触使用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的强转功能,也能够顺畅的进行控制台录入了~~~

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值