mysql中文乱码诊断及解决-这些年我踩过的坑

mysql中文乱码相信是每一名java web码农抓耳挠腮又痛心疾首的问题,有病乱投医,一通搜索,照着网上方法一个又一个的做,“怎么还是特么不行?!!”。

实际上从表面现象看,网上的问题和你的问题都是中文出现了乱码,但病源出在哪,却各不相同。Ok,别慌张,沉下来心跟我一步步诊断病因,并彻底根除。

声明:本文旨在帮助大家找出乱码的原因和解决办法,具体操作自行百度google。

大原则:数据库、表和字段、页面三者的字符集要统一!

首先,(打断点或者打印一下)查看从dao层取出的数据是否已经乱码

若已出现乱码,那问题出现在数据库编码数据库连接表和字段的字符集上。

检查数据库编码

mysql默认编码为latin1,不支持中文。所以需要将数据库编码手动修改为gb2312,gbk或utf-8。个人建议使用utf-8,原因是支持繁体中文和一些特殊符号。

命令:
查看数据库编码:
show variables like 'character%';
变量说明:

character_set_client为客户端编码方式;
character_set_connection为建立连接使用的编码;
character_set_database数据库的编码;
character_set_results结果集的编码;
character_set_server数据库服务器的编码;

搜索tip:查看修改mysql编码方式

如果需要建新数据库,一定要注意指定编码。
命令:

CREATE DATABASE test DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

但有人说重启服务器服务后会失效,所以要通过my.ini配置来永久设置。不过本人还没验证过,欢迎指教。

检查数据库连接设置

这里手动查看吧,设置方式取决于你的数据库连接配置获取方式。

如果是写在代码里:

String url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";

如果是写在基于xml的配置文件里(如使用Tomcat连接池的context.xml,Hibernate的hibernate.cfg.xml,或iBATIS的sqlMapConfig.xml):

基本xml的连接配置.png

注意二者不同:代码里参数的连接用&,而xml里参数的连接用& amp;(5个字符,(&、a、m、p、;)中间没有空格。

连接配置详情参考官方文档:
http://dev.mysql.com/doc/connectors/en/connector-j-reference-configuration-properties.html

检查表和字段的字符集

表一般不需要格外关注。
字段的话,如果是char或varchar指定字符为utf8。

搜索tip:mysql查看修改字段字符集

若没出现乱码,那问题便出在前端页面。

若问题出现在前端页面,那情况可能会很复杂,但幸好最常见的情况就这几种:

若为静态页面

在中加入以下meta,指定字符格式就好了。

若为动态页面

在jsp最顶端设置字符格式

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

究极万能百分之一百万有效

浏览器的编码格式设为utf-8,啊,有没有觉得自己傻*了?

搜索tip:jsp页面中文乱码

结束语

你的病,好了吗?

我是惊蛰,立志从搬砖的码农成长为优秀的程序员.
QQ:623001594

你可能感兴趣的:(mysql中文乱码诊断及解决-这些年我踩过的坑)