mysql + java 乱码问题的解决

mysql 的编码比较麻烦,他的编码有好几层:字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。

连接级如果不指定编码则为latin1编码。

服务器级、数据库级、表级 这三级中如果服务器级没加特别的设置的话那他默认是latin1编码的,以后在建库见表都是默认latin1编码
当然 三个级别不一定编码要一样,可以服务器是latin1 ,数据库是gb2312 ,表是utf-8

一般来说:表的编码默认=库的编码默认=服务器编码。当然如果服务器编码为latin1,然而在建库的时候指定编码为gb2312,那么再建表的时候
如果不指定编码则默认=库的编码 为gb2312,即默认为最邻近的上层编码 。

如果表的编码为gb2312,那当用jdbc连库时应该在建connction时这样写:
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test3?user=root&password=123456&useUnicode=true&characterEncoding=GB2312");
指定连接编码为gb2312,则如果是java  string 是中文的话,那么无需进行编码转化即可正确写入表中。

如果表的编码为latin1,那么jdbc连库时应该在建connction时这样写:
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test3?user=root&password=123456");
即用默认的latin1编码连接数据库,然而如果string 是中文的话必须进行编码转化:

pstm.setString(1, new String(info.getCity().getBytes("gb2312"),"iso8859-1"));


也即是说表的编码是什么就应该以什么样的编码去链接库。如果表的编码不支持中文(如:latin1)写库和读库则要进行编码转化,如果支持中文(如:gb2312)不用进行编码转化只需在连库的时候指定正确的编码。


另外注意:如果表的编码为gb2312等(非latin1),在mysql 客户端或控制台,察看表内容时:一定要先指定连接编码为表的编码,如:gb2312等。 指定的语句如下 :SET CHARACTER SET gb2312;这样才能保证,看到的不是乱码,否则即使在表中的数据存储的时正确的,如果察看时没有指定正确的连接编码,则也会看到乱码,使自己产生错误的判断。尤其是在liunx下察看时,默认连接编码一般都是latin1,如果表的编码为gb2312,则就会看到乱码,所以一定要指定连接编码。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值