您的位置:首页 > 数据库 > MySQL

Mysql乱码终极解决方案

2010-05-03 14:06 169 查看
Mysql乱码产生的原因:

产生此类问题的最可能是你的数据库在安装时没有选对字符集,这个十分重要.

你可以通过如下的方式来查看:打开Mysql窗口,在窗口的最左上角点击鼠标右键,选择属性,就可以看到你默认的字符编码了(如下图):

2. 使用多种校对规则(Collation)来比较字符串

MySQL 中是根据下面几个变量确定服务器端和客户端用的什么字符集:
character_set_client      客户端字符集

  character_set_connection   客户端与服务器端连接采用的字符集
  character_set_results     SELECT查询返回数据的字符集
  character_set_database    数据库采用的字符集

MySQL的字符集处理是这样的:
  1、发送请求。
  1)客户端发送请求到服务器端。
  2)服务器端会把请求的数据从客户端字符集(character_set_client)转成服务器连接字符集(character_set_connection)。
  3)然後服务器会检测存储区域(table,column)的字符集,然后把数据从连接字符集(character_set_connection)转为存储区域(table,column)的字符集,然後再存储或者查询。
  2、返回请求。
  1)服务器将存储区域(table,column)的字符集转换成服务器连接字符集(character_set_connection)。
  2)将服务器连接字符集(character_set_connection)转换成结果字符集(character_set_results),再发送到客户端。

可以采用如下几个步骤让上面的请求编码都统一,这样就不会出现乱码的问题了:
*****数据库********
一:最好在安装时 选择 utf8 或者 gbk

二:在创建数据库时时用如下方式创建:
create database db default charset utf8

三:用show variables like '%set%'; 把里面有关编码的都改成和你创建数据库时相同的编码,比如UTF8
该法如下:
* 用上面的方式创建数据库后 character_set_system 、 character_set_database已经是utf8了
* 可用set names utf8 一次改变character_set_client 、character_set_connection 、character_set_results 为utf8:
* 剩下1个编码可以用如下方式解决:
set character_set_server=utf8;

*******程序中设置编码*********
一: jdbc 或者 hibernate 都可以这样
jdbc:mysql://127.0.0.1:3306/ajax?useUnicode=true&characterEncoding=utf8

二:response.setContentType("text/plain;charset=utf-8"); //Servlet设置编码

三:jsp页面<%@page contentType="text/html;charset=utf-8"%>

可以从上图中看到我的Mysql默认的编码是gbk
所以我为了避免乱码问题可以:
1.采用如下方式创建数据库:
CREATE DATABASE studentmanager DEFAULT CHARSET GBK;
进入数据库:USER studentmanager;
2.建表:
CREATE TABLE student (
id int(11) NOT NULL auto_increment,
name varchar(20) ,
PRIMARY KEY (id)
)ENGINE=InnoDB DEFAULT CHARSET=GBK;
3,然后就可以放心的插入中文了:
INSERT INTO student VALUES (1, ‘张华’);
提交:COMMIT;/
查看:SELECT * FROM student; 就可以看到中文已经插进去了额。
上面是使用Mysql 终端直接进行插入的方式。

下面使用的是JAVA WEB (Servlet, Struts等)+JDBC的时候进行插入:
1)页面编码设置(和数据库一样的编码)
2)使用过滤器拦截请求然后处理编码(主要是处理页面表单提交的中文):
HttpServletRequest reqest = (HttpServletRequest)request;
HttpServletResponnse response = (HttpServletResponse)response;
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");

4. 允许定义任何级别的字符集和校对规则

MySQL 4.1及以上版本的字符集支持(Character Set Support)有两个方面:字符集(Character Set)和校对规则(Collation)。 字符集和校对规则有4个级别的默认设置:服务器(server),数据库(database),数据表(table)和连接(connection)。

3. 在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串

MySQL 4.1.x开始支持以下这些事情:

1. 使用多种字符集(Character Set)来存储字符

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: