本文描述了在基于JSP +MySQL构建网站时,发生网页中文显示为乱码情况的解决办法。最终希望使用的编码是:统一的UTF-8编码。
试验网站的开发运行环境:
OS: Ubuntu 12.04 及 Windows 7
IDE: eclipse, Juno Service Release 2
Web Server: Tomcat 7.0.27
DataBase: MySQL 5.5.29
本文的一些观点应该也能推广到其他编码、平台或数据库。
网站的中文输入输出产生或接收到乱码的原因,可能发生在数据流动的任意节点处。但是,如果保证所有的位置都使用了统一的编码,则可以消除中文乱码的情况。这些可能发生转码的地方包括网页的编码定义,JSP页面的编码,Java代码文件的编码,Tomcat读取的web.xml中的定义,MySQL的client、server、connection以及每个数据库、每个表、甚至每个字段的编码设定。根据之前查找的一些资料,和刚刚做完的实验,将相关的设定总结如下:
在这个过程中,首先应保证数据库在存储数据、存入数据以及数据时应一致。其次,在进行网页服务器后台处理和传递的过程中应保证编码的一致。最后应保证,数据在进行浏览器前台显示和数据传递的过程中编码的一致。只要保证这一切都采用统一的编码格式,就不会产生中文乱码的问题。
(1) MySQL 数据库的相关定义和配置方法。
MySQL中有关于字符集的概念主要有两个,一个是字符集(Character Set),一个是字符序(collation)。MySQL内部会采用如下的变量进行字符集的设定:
– character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集
– 还有以collation_开头的同上面对应的变量,用来描述字符序。
MySQL中的字符集转换过程如下:
① MySQL 客户端库收到请求时将请求数据从character_set_client