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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章