解决使用SSM框架、MySql出现中文乱码问题

一、前言:

在使用SSM框架搭建后台时,有时经常会出现乱码现象,网上针对乱码大多只是提供相应的思路,但在我看来,我们在解决错误的时候应该多深究背后错误的原因并做总结,以便日后面对类似问题可以得心应手。以下便是个人针对乱码做的一个编码设置总结。

二、编码与解码:

概念: 众所周知,计算机的存储和处理都是使用01二进制串(字节),而我们在页面所编写的和存储在数据库的数据是字符的形式。所以通俗来讲,编码即使将数据转化为字节形式,解码即是恢复数据,将数据从字节形式转化为字符形式。

常见的字符集: ASCII、GB2312、GBK、GB18030、UTF-8、 ISO8859-1、BIG5;
详细了解可参考:https://www.cnblogs.com/DannyShi/p/4616771.html
常见字符集兼容性如图:(下图字符集向下扩展,向上兼容,不同线不兼容)
在这里插入图片描述
中文乱码产生原因:
第一种情况:使用不能识别中文的字符集来编码(较少见)。
第二种情况:编码和解码时用了不同或者不兼容的字符集(较常见)。

三、编码设置汇总(javaweb 、SSM、数据库)

1、jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  • pageEncoding的作用是设置页面编码,也是设置服务器响应编码。
  • contentType的作用是指定对服务器响应进行重新编码的编码。
  • 若响应编码(上面的charset)未进行设置,将取pageEncoding值;
    若同时设置ContentType 和 pageEncoding,取ContentType值;
    若都未设置,就取默认的字符集ISO-8859-1编码。

2、SSM
web.xml配置编码过滤器(针对post请求)

<!-- 编码过滤器 -->
<filter>
	<filter-name>encoding</filter-name>
	<filter-class>
		org.springframework.web.filter.CharacterEncodingFilter
	</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>encoding</filter-name>
	<url-pattern>*.action</url-pattern>
</filter-mapping>

tomcat的配置文件server.xml设置对应端口编码(针对get请求)

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" 
               useBodyEncodingForURI="true" 
               disableUploadTimeout="true"
               URIEncoding="UTF-8" />

(注:使用eclipse的,应该在eclipse中修改tomcat配置文件。)

  • useBodyEncodingForURI是根据响应该请求的页面的request.setCharacterEncoding参数对数据进行的重新编码(解码);
  • URIEncoding是对所有GET方式的请求的数据进行统一的重新编码(解码);
  • 不同的页面可以有不同的重新编码(解码)的编码。

controller控制请求和响应的编码

  • request.setCharacterEncoding(“UTF-8”)
    作用是设置对客户端请求进行重新编码。仅适用于设置post提交的request body的编码。
  • response.setCharacterEncoding(“UTF-8”)
    作用是指定对服务器响应进行重新编码。浏览器会根据这个参数来对其接收到的数据进行解码。
  • response.setContentType(“text/html;charset=UTF-8”)
    作用是浏览器对随响应到来的数据的处理编码方式。其优先级大于“Content-Type : text/html ;”

mybatis配置数据库编码

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

3、数据库
对于数据库的编码,包含了系统字符集编码、指定数据库的字符集编码、数据库表字符集编码、表字段字符集编码。

- 查看mysql的系统字符集:
SHOW VARIABLES LIKE '%char%';
- 查看某数据库字符集:
SHOW CREATE DATABASE db_name;
- 查看某数据表字符集:
SHOW CREATE TABLE tbl_name;
- 查看某表字段字符集:
SHOW FULL COLUMNS FROM tbl_name;
- 修改mysql的系统字符集:
SET character_set_connection=utf8;(例)
- 修改数据库enterprises的字符集:
- ALTER  DATABASE  db_name CHARACTER SET utf8;
- 修改数据表employees的字符集:
ALTER TABLE tbl_name CHARACTER SET utf8;
- 修改字段的字符集:
ALTER TABLE  tbl_name CHANGE name name VARCHAR(12) CHARACTER SET utf-8;

在这里插入图片描述

character_set_client:客户端请求数据的字符集
character_set_connection:客户机/服务器连接的字符集
character_set_database:默认数据库的字符集,这个变量建议由系统自己管理,不要人为定义。
character_set_filesystem:把os上文件名转化成此字符集, 默认binary是不做任何转换的。
character_set_results:结果集,返回给客户端的字符集
character_set_server:数据库服务器的默认字符集
character_set_system:系统字符集,这个值总是utf8,不需要设置。

详细了解可参考:https://www.cnblogs.com/skying555/p/10512329.html

四、解惑

客户端、服务器和数据库的编码一定要一致吗?
可以不一致。第一字符集编码可以兼容;第二,可以进行转码处理;但是建议配置编码一致,以免出现不必要的bug,容易掉头发。
出现乱码怎么办?
首先应该判断错误的类型,判断错误的产生是在客户端与服务器之间的编解码还是服务器与数据库的编解码。然后进行字符集比对,看是否一致或兼容。从数据的接收和发送两方面去校对字符集。如果无法判断在哪出现问题,那么就按照上面取一一排除,相信大多数问题会逐渐浮出水面。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章