自己的mysql乱码问题解决
虽然解决不过还是有疑惑的地方
解决方案:
在安装目录下找到my.ini这个文件,将client和server的字符设置都改为gbk
这样就好了
用 SHOW VARIABLES LIKE 'character_set_%';命令查看字符设置 我的修改后为:
| character_set_client | gbk
|
| character_set_connection | gbk
|
| character_set_database | gbk
|
| character_set_filesystem | binary
|
| character_set_results | gbk
|
| character_set_server | gbk
|
| character_set_system | utf8
这样修改后 试验:
创建数据库 表:
create database java;
use java;
CREATE TABLE person
(
id varchar(20) not null primary key ,
name varchar(20) ,
password varchar(20)
) ;
INSERT INTO person VALUES ('helle','你好','zzzzzz') ;
commit;
登陆界面:;login.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
<title>jsp+jdbc test</title>
</head>
<body>
<center>
<h1>
---jsp+jdbc
</h1>
</center>
<hr>
<br>
<%
if (session.getAttribute("uname") != null) {
//说明用户已经登陆
%>
<h2>
登陆成功
</h2>
<h2>
欢迎<%=session.getAttribute("uname")%></h2>
<%
} else {
//用户未登陆,提示用户登陆并跳转到登陆界面
response.setHeader("refresh", "2;URL=login.jsp");
%>
您还未登陆,请先登陆!!!
<br>
两秒钟后自动跳转到登陆界面!
<br>
如果没有跳转请点击
<a href="login.jsp">这里</a>
<%
}
%>
</body>
</html>
验证界面:login_conf.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<head>
<title>jsp+jdbc test</title>
</head>
<body>
<center>
<h1>
jsp+jdbc tst
</h1>
<hr>
<br>
<%!String DBDRIVER = "com.mysql.jdbc.Driver";
String URL = "jdbc:mysql://localhost/java";
String DBUname = "root";
String DBpassword = "aaa";
Connection conn = null;
PreparedStatement pstmt = null;
String sql = null;
ResultSet rs = null;%>
<%
// 声明一个boolean变量,用于保存用户是否合法的状态
boolean flag = false;
//接受参数
String id = request.getParameter("id");
String password = request.getParameter("password");
%>
<%
sql = "select * from person where id=? and password=?";
try {
Class.forName(DBDRIVER).newInstance();
} catch (Exception e) {
out.println("加载驱动错误");
}
try {
conn = java.sql.DriverManager.getConnection(URL, DBUname,
DBpassword);
} catch (Exception e) {
out.println("连接错误");
}
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, password);
rs = pstmt.executeQuery();
if (rs.next()) {
//用户合法
flag = true;
//将用户名保存在session中
session.setAttribute("uname", rs.getString(2));
} else {
//保存错误信息
request.setAttribute("err", "错误的用户名和密码");
}
rs.close();
pstmt.close();
conn.close();
} catch (Exception e) {
out.println("操作失败");
}
%>
<%
//跳转
if (flag) {
//用户合法
%>
<jsp:forward page="login_success.jsp"></jsp:forward>
<%
}
//用户非法
else {
%>
请登陆<jsp:forward page="login.jsp"></jsp:forward>
<%
}
%>
</center>
</body>
</html>
成功页面:login_success.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<html>
<head>
<title>jsp+jdbc test</title>
</head>
<body>
<center>
<h1>
jsp+jdbc test
</h1>
</center>
<hr>
<br>
<%
if (session.getAttribute("uname") != null) {
//说明用户已经登陆
%>
<h2>
登陆成功
</h2>
<h2>
欢迎<%=session.getAttribute("uname")%></h2>
<%
} else {
//用户未登陆,提示用户登陆并跳转到登陆界面
response.setHeader("refresh", "2;URL=login.jsp");
%>
您还未登陆,请先登陆!!!
<br>
两秒钟后自动跳转到登陆界面!
<br>
如果没有跳转请点击
<a href="login.jsp">这里</a>
<%
}
%>
</body>
</html>
不过不明白的地方还是很多的:我只是修改了数据库中的编码 是用gbk来存了,可是在程序中我也没有写类似过滤器的代码,
以前我还在程序页面开头 加了:
<%
request.setCharacterEncoding("gb2312");
response.setCharacterEncoding("gb2312");
%>
发现把这两句都删了 在成功页面还是能取出中文字符的
不知道为何 ?
今天可能明白一点了,写下:
request.setCharacterEncoding("gb2312");是设置用户jsp界面向服务器提交中文时用的。
上面的之所以去掉没有什么变化是因为:我们没有从jsp中提交数据,我们只是从数据库中读取了数据,在mysql5.0中设置好了 编码gbk后 自动就会在连接url中添加设置编码为gbk
到目前 估计对这个编码问题理解的还好了一点 了吧