標籤:
轉自:http://hi.baidu.com/cnvienna/blog/item/2e99efdfd94fc61862279801.htmlMySQL會出現中文亂碼的原因不外乎下列幾點:1.server本身設定問題,例如還停留在latin12.table的語系設定問題(包含character與collation)3.用戶端程式(例如php)的連線語系設定問題強烈建議使用utf8!!!!utf8可以相容世界上所有字元!!!!一、避免建立資料庫及表出現中文亂碼和查看編碼方法1、建立資料庫的時候:CREATE DATABASE `test` CHARACTER SET ‘utf8‘ COLLATE ‘utf8_general_ci‘;2、建表的時候 CREATE TABLE `database_user` ( `ID` varchar(40) NOT NULL default ‘‘, `UserID` varchar(40) NOT NULL default ‘‘, ) ENGINE=InnoDB DEFAULT CHARSET=utf8;這3個設定好了,基本就不會出問題了,即建庫和建表時都使用相同的編碼格式。但是如果你已經建了庫和表可以通過以下方式進行查詢。1.查看預設的編碼格式:mysql> show variables like "%char%"; +--------------------------+---------------+ | Variable_name | Value |+--------------------------+---------------+ | character_set_client | gbk || character_set_connection | gbk || character_set_database | utf8 || character_set_filesystem | binary || character_set_results | gbk || character_set_server | utf8 || character_set_system | utf8 |+--------------------------+-------------+ 註:以前2個來確定,可以使用set names utf8,set names gbk設定預設的編碼格式; 執行SET NAMES utf8的效果等同於同時設定如下: SET character_set_client=‘utf8‘; SET character_set_connection=‘utf8‘; SET character_set_results=‘utf8‘;2.查看test資料庫的編碼格式:mysql> show create database test;+------------+------------------------------------------------------------------------------------------------+| Database | Create Database |+------------+------------------------------------------------------------------------------------------------+| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET gbk */ |+------------+------------------------------------------------------------------------------------------------+3.查看yjdb資料庫的編碼格式:mysql> show create table yjdb;| yjdb | CREATE TABLE `yjdb` (`sn` int(5) NOT NULL AUTO_INCREMENT,`type` varchar(10) NOT NULL,`brc` varchar(6) NOT NULL,`teller` int(6) NOT NULL,`telname` varchar(10) NOT NULL,`date` int(10) NOT NULL,`count` int(6) NOT NULL,`back` int(10) NOT NULL,PRIMARY KEY (`sn`),UNIQUE KEY `sn` (`sn`),UNIQUE KEY `sn_2` (`sn`)) ENGINE=MyISAM AUTO_INCREMENT=1826 DEFAULT CHARSET=gbk ROW_FORMAT=DYNAMIC |二、避免匯入資料有中文亂碼的問題1:將資料編碼格式儲存為utf-8設定預設編碼為utf8:set names utf8;設定資料庫db_name預設為utf8:ALTER DATABASE `db_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;設定表tb_name預設編碼為utf8:ALTER TABLE `tb_name` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;匯入:LOAD DATA LOCAL INFILE ‘C:\\utf8.txt‘ INTO TABLE yjdb;2:將資料編碼格式儲存為ansi(即GBK或GB2312)設定預設編碼為gbk:set names gbk;設定資料庫db_name預設編碼為gbk:ALTER DATABASE `db_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;設定表tb_name預設編碼為gbk:ALTER TABLE `tb_name` DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci;匯入:LOAD DATA LOCAL INFILE ‘C:\\gbk.txt‘ INTO TABLE yjdb;檔案轉換:(gb2312 -> utf-8)iconv -t utf-8 -f gb2312 -c search.dat > search22.dat註:1.UTF8不要匯入gbk,gbk不要匯入UTF8; 2.dos下不支援UTF8的顯示;三、解決網頁中亂碼的問題將網站編碼設為 utf-8,這樣可以相容世界上所有字元。 如果網站已經運作了好久,已有很多舊資料,不能再更改簡體中文的設定,那麼建議將頁面的編碼設為 GBK, GBK與GB2312的區別就在於:GBK能比GB2312顯示更多的字元,要顯示簡體碼的繁體字,就只能用GBK。1.編輯/etc/my.cnf ,在[mysql]段加入default_character_set=utf8;2.在編寫Connection URL時,加上?useUnicode=true&characterEncoding=utf-8參;3.在網頁代碼中加上一個"set names utf8"或者"set names gbk"的指令,告訴MySQL連線內容都要使用utf8或者gbk; 作者: www.quicklinux.org 郵件: [email protected]MySQL4.1是比較煩人.支援多語言的細化設定.再加上PhpMyadmin-2.6也比較笨.預設就是改不動的UTF-8.怎麼弄都亂碼.好了.廢話少說.我們來一步步解決這個問題:1. 修改/etc/my.cnf檔案.改成如下內容:[mysqld]datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockdefault-character-set=utf8[mysql.server]user=mysqlbasedir=/var/lib[mysqld_safe]err-log=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid注意.就是加入了一句: default-character-set=utf82. 命令 /etc/init.d/mysqld restart 重新啟動MySQL.3. 開啟PhpMyadmin. 選擇Lang為"Chines simplifies(zh-utf-8)". 選擇"MySQL串連校對為utf8_general_ci". 點"伺服器變數和設定". 可以看到:character set client utf8 utf8character set connection utf8 utf8character set database utf8 utf8character set results utf8 utf8character set server utf8 utf8character set system utf8 utf8collation connection utf8_general_ci utf8_general_cicollation database utf8_general_ci utf8_general_cicollation server utf8_general_ci utf8_general_ci從這裡可以看到character全部變成UTF-8了.為什麼都要改成UTF-8呢?改成GB2312不行嗎?解釋如下:我也不想改成UTF-8. 只是PhpMyadmin 2.6在MySQL 4.1的時候只會用UTF-8. 連其他頁面的charset也都是UTF-8. 改成GB23122一定會亂碼. 我們只能湊PhpMyadmin了. 只有在MySQL 3.23的時候PhpMyadmin才會多一個GB2312的頁面charset.這時候是正常的.3. 將以前的MySQL 3.23的庫檔案匯入MySQL 4.1的庫.有兩種情況:一是從PhpMyadmin上匯入. 這時候你要注意的是在選擇庫檔案的頁面左下腳有個"檔案的字元集:". 預設是UTF-8. 要改成Gb23122. 否則導進去亂碼.二是在Linux下匯入.這時候你需要先在庫檔案的頭部加一行:SET NAMES ‘gb2312‘;注意最後也是;號. 別漏了. 然後執行: MySQ -u 使用者名稱 -p 密碼 xxx.sql > 庫名匯入完成以後再用PhpMyadmin開啟看. 裡面的中文字就是正確的.4.從MySQL 4.1裡匯出庫檔案一.用PhpMyadmin匯出.匯出倒是問題不大.如果PhpMyadmin的瀏覽頁面裡顯示的中文是正常的.那麼匯出肯定也是正常的.二.在Linux上匯出.如果用mysqldump匯出出現了亂碼也沒有關係.可以運行iconv來轉換一下:iconv -c -f UTF-8 -t GB2312 庫檔案名稱 > 新的Gb2312的庫檔案名稱綜上所述.需要注意:1. 盡量在需要匯入的庫檔案的開頭加入 SET NAMES ‘Gb2312‘; 告訴MySQLl你要匯入的是一個Gb2312的檔案.2. 可能你需要這個: SET NAMES ‘utf8‘; 在登陸到MySQL後用.3. 把character的一些預設參數改到UTF-8上.有時可以減少一些困擾.不過也不是必須的.4. 在MySQL上使用: SHOW VARIABLES LIKE ‘character_set_%‘; 用來查看當前的狀態.5. 如果出現亂碼也不要怕.一是你要注意留存原有的備份.二是用iconv來進行轉化.
解決mysql中文亂碼(總)