MySql乱码问题

 

1.修改数据库编码,如果是数据库编码不正确: 可以在phpmyadmin 执行如下命令: ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将test数据库的编码设为utf8
2.修改表的编码:ALTER TABLE `category` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
以上命令就是将一个表category的编码改为utf8
3.修改字段的编码:
ALTER TABLE `test` CHANGE `dd` `dd` VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
以上命令就是将test表中 dd的字段编码改为utf8

 

1.修改数据库默认编码(修改配置文件:my.ini)
 default-character-set=gbk

2.修改Tomcat的配置文件(tomcat server.xml)

  name="Catalina">
    <Connector
        URIEncoding="GBK"
        port="8080"
        redirectPort="8443"
        minSpareThreads="25"
        connectionTimeout="20000"
        uRIEncoding="GBK"
        maxThreads="150"
        maxSpareThreads="75"
        maxHttpHeaderSize="8192">
    </Connector>

3.配置过滤器

package com.wnkh.community.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class SetCharacterEncodingFilter implements Filter {
 FilterConfig filterConfig;

 public void doFilter(ServletRequest request, ServletResponse response,
   FilterChain filterChain) throws IOException, ServletException {
  // TODO Auto-generated method stub
 
  MyRequest req = new MyRequest((HttpServletRequest) request);// 设置代理请求
  
  filterChain.doFilter(req, response);
 }
 public void init(FilterConfig arg0) throws ServletException {
  this.filterConfig = arg0;

 }

 public void destroy() {
 filterConfig=null;
  
 }
}
class MyRequest extends javax.servlet.http.HttpServletRequestWrapper {// 自定义的代理请求类
 HttpServletRequest request;

 public MyRequest(HttpServletRequest request) {
  super(request);
  this.request = request;
 }

 public String[] getParameterValues(String name) {
  String strs[] = super.getParameterValues(name);
  for (int i = 0; i < strs.length; i++) {
   strs[i] = this.myEncoding(strs[i]);
  }
  return strs;
 }

 private String myEncoding(String input) {
  String output = "";
  try {
   output = new String(input.getBytes("ISO-8859-1"), "gbk"); // 注意同页面的编码保持一致
  } catch (UnsupportedEncodingException e) {
  
   e.printStackTrace();
  }
  return output;
 }

}

 

 

4.或者往数据库中存数据的时候先一步进行修改

type=new String(type.getBytes("ISO-8859-1"),"gb2312");

 

设置和查看MySQL数据库的编码

1 在my.cf文件的[mysqld]段设置:
default-character-set=utf8

2 单独设置某个数据库:
alter database testdb character set utf8;

查看mysql支持的编码:
show character set;

 

 

如果你遇到乱码问题,可以从下面几个问题逐步检查:

(1)检查你的文件存储编码是否和 meta 声明的一致,假如你的文件是按照 utf-8 编码存储,但是 meta 却声明为 gb2312 ,将导致乱码。

解决办法:将页面存储编码和 meta 声明保持一致。用记事本打开文件,“另存为”,下面有个选项是“编码”,选择和 meta 声明一致的编码方式。(提示:meta 的编码声明要放在 title 标签前面,否则容易导致页面空白。)

(2)检查你的数据库连接有没有设置连接方式(SET NAMES),Mysql4.1 版本以后,如果你没有设置数据库连接方式,那么插入或者查询将出现乱码情况。

解决办法:在你的数据库连接后面(通常是在Mysql_conneCT后面,执行任何查询之前)加上一句 :

Code:
Mysql_query("SET NAMES utf8");


其中 utf8 需要根据你需要设置。

(3)检查你的页面编码、meta 声明、数据库连接方式(SET NAMES)是否一致,如果你的页面和meta设置为gb2312,但是却在程序中设置 SET NAMES utf8,同样会导致乱码。原因是如果页面设置为 gb2312 ,那么表单中的数据也是按照 gb2312 提交,但是程序却要求按照 utf8 去处理,结果自然是乱码。

解决办法:将页面编码、meta 声明、数据库连接方式(SET NAMES)保持一致,当然这里说的一致不是绝对的,如Mysql的 utf8 和页面中的 utf-8 是不一样的,具体要根据你的实际情况设置。

前段时间帮客户将 phpbb 2 迁移到 Discuz! 5,客户要求论坛数据不能有太大损失,本来已经找到了一个转换程序,可以将原有数据迁移到新的数据表中,结果转换后发现页面上全是乱码。仔细研究发现:phpbb 安装是按照默认的字符编码 latin1 ,而  Discuz! 用的是 gbk ,也就是标题说的“不同字符集数据表转换出现乱码”。

解决方法是转换数据编码方式:

第一步:将数据导出成期望的字符编码:
Code:
Mysqldump -u用户名 -p密码 --default-character-set=原字符集 --set-charset=期望字符集 --skip-opt数据库名 > 导出的文件名.sql



在上文提到的例子中,用下面的命令:
Code:
Mysqldump -uroot -p*** --default-character-set=latin1 --set-charset=gbk --skip-opt phpbb> phpbb_gbk.sql



第二步:建立一个期望字符集的临时数据库
Code:
CREATE DATABASE `phpbb_gbk` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;


注意:这个是上文提到的例子中所用的命令,具体到实际应用时,要根据需要设置。


第三步:将第一步备份的数据导入到这个新创建的临时数据库里面:
Code:
Mysql-u用户名 -p密码 --default-character-set=期望字符集 -f数据库名<第一步备份的文件名.sql


在我的例子中是用下面的命令:
Code:
Mysql-uroot -p*** --default-character-set=gbk -f phpbb_gbk<phpbb_gbk.sql

发布了27 篇原创文章 · 获赞 4 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章