首先,出现的乱码的原因在于编码方式不统一,主要是mysql数据库的编码方式和web项目的编码方式,只有遵循了编码方式统一的原则,才能避免产生乱码问题。
通常项目中使用的都是UTF-8编码,因此,我们在新建数据库时,要设置默认编码方式为UTF-8,具体步骤如下:
一、Windows环境下的mysql配置:
进入mysql安装目录,找到my.ini或者是my-default.ini文件,在[mysqld]和[client]后面增加"default-character-set=utf8",设置mysql默认编码为utf8:
设置后记住重启mysql服务。
二、更改了数据库系统编码后,还需注意数据库编码,使用create database 新建数据库时,要在后面加上character set utf8 collate utf8_general_ci:
create database mydb1 character set utf8 collate utf8_general_ci;
collate utf8_general_ci是指定该数据库的校对规则。
三、新建数据库表时,添加default charset utf8:
create table mytb1
(id varchar(20) primary key,
name varchar(40) not null)
default charset utf8;
这样,新表的编码就是UTF-8了。
四、应用程序的编码:
以jsp页面为例:
<%@ page contentType="text/html; charset=UTF-8" %>
五、应用系统与数据库系统连接的编码:
以JDBC为例,在编写用于连接的url时,需加上相应参数:
String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&";
&是&的转义符。
六、在编写应用程序中,其它需要注意编码的地方:
比如:servlet中,
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
String value = request.getParameter("name");
value = new String(value.getBytes("ISO8859-1"),request.getCharacterEncoding());
另外,在项目建立起来后,发现的mysql乱码问题,有时很可能需要修改数据库的编码方式,除上述几个涉及到mysql的修改方式外,还需以下几个操作:
一、部分数据表的列编码需要修改:
使用show create table tb2时,可以看到有可能修改了数据库、数据库表的编码方式,但列的编码方式没有修改为utf8:
因此,需要单独修改:
alter table mytb2 change username username varchar(40) character set utf8;
二、依次将编码不正确的列进行修改,当修改具有外键约束的列时,又会出现新的问题,mysql系统不允许修改,并抛出错误。
因此,必须将具有外键约束的表解除约束,再进行修改,之后再重新添加约束:
alter table mytb2 drop foreign key foreignKeyName;
alter table mytb2 change foreignKeyName foreignKeyName varchar(40) character set utf8;
alter table mytb2 add constraint FK_foreignKeyName foreign key(foreignKeyName) references mytb1(column_name);
经过了上面的所有操作后,mysql乱码问题就可以解决了。