mysql 亂碼解決方案



mysql 亂碼解決方案

再談亂碼問題,如何解決MYSQL數據中文亂碼問題

        在之前的文章裏,我已經提過如何解決JSP中亂碼問題(解決tomcat下中文亂碼問題 ),其中也詳細解說了MYSQL亂碼問題,相信通過裏面的辦法,肯定都已經解決了JSP裏的亂碼問題,不過還是有些人的MYSQL亂碼問題沒有得到解決,包括我自己,所以又找了一些資料,希望這次能完全解決MYSQL數據庫的亂碼問題。


 

第一種方法,總結:

經常更換虛擬主機,而各個服務商的MYSQL版本不同,當導入數據後,總會出現亂碼等無法正常顯示的問題,查了好多資料,總結出自己的一點技巧:

WINDOWS 下導入應該這樣
使用MYSQL的命令
在DOS命令下進入mysql的bin目錄下,輸入mysql -uroot -p密碼 數據庫名稱<要恢復的數據庫, 例如我們要把D盤的一個名稱爲test.sql的數據庫恢復到本地的test2這個數據庫,那麼就這樣: mysql -uroot -p密碼 test2以前的國外主機用的Mysql是4.x系列的,感覺還比較好,都無論GBK和UTF-8都沒有亂碼,沒想到新的主機的Mysql是5.0版本的,導入數據後,用Php讀出來全是問號,亂碼一片,記得我以前也曾經有過一次切換出現亂碼的經驗,原因肯定是Mysql版本之間的差異問題。

只好查資料,發現了一個解決方法,就是在mysql_connect後面加一句SET NAMES UTF8,即可使得UTF8的數據庫消除亂碼,對於GBK的數據庫則使用SET NAMES GBK,代碼如下:

$mysql_mylink = mysql_connect($mysql_host, $mysql_user, $mysql_pass);
mysql_query("SET NAMES 'GBK'");

 

數據庫字符集爲utf-8

連接語句用這個
mysql_query("SET NAMES 'UTF8'");
mysql_query("SET CHARACTER SET UTF8");
mysql_query("SET CHARACTER_SET_RESULTS=UTF8'");

還有個方法就是,如果你自己的機器的話,可以更改MYSQL字符集,一般在MYSQ4和MYSQL5這兩個版本中有效


 

第二個方法:很不錯的解說,可以試一下

mysql亂碼處理總結:

       (1)java中處理中文字符正常,在cmd client中顯示亂碼是字符集的問題.

       (2)字段長度設置夠長,但插入中文字符時提示com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column錯誤是字符集的問題.

       (3)亂碼問題歸根到底是字符集的問題,那就從字符集設置方面考慮,不外乎下面幾個方面:server,client,database,connection,results.

-------------------------解決辦法----------------------

(1)修改 my.ini(MySQL Server Instance Configuration 文件)

# CLIENT SECTION

[client]

port=3306

[mysql]

default-character-set=gbk


# SERVER SECTION

[mysqld]

default-character-set=gbk

(2)修改data目錄中相應數據庫目錄下的db.opt配置文件

default-character-set=gbk
default-collation=gbk_chinese_ci

(3)數據庫連接串中指定字符集

URL=jdbc:mysql://yourIP/college?user=root&password=yourPassword&useUnicode=true&characterEncoding=gbk 注:在mysql4.1.0版 要加useUnicode=true&characterEncoding=gbk 如果是5.0版以上的,加不加都是沒有關係的!

(4)在創建數據庫時指定字符集

create database yourDB CHARACTER SET gbk;

(5)在dos命令上要設置

set names gbk

(6)安裝數據庫的時候指定字符集   如指定爲UTF-8的字符集,如圖:


       好了,經過檢查上面四個方面的設置,應該 OK 了!不會出現諸如
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column等問題.

 

 

 

Mysql中文亂碼解決
原來常常在羣裏看到mysql的亂碼問題,但是由於本人一直在用oracle和sql server所以沒多在乎,昨天用了用mysql結果就遇到了傳說中的亂碼…..。現在我們來講講mysql的亂碼問題。首先你進入的你mysql
用show variables查看


這裏可以查看到你的字符集,character_set_server是服務器編碼。現在我們默認的是latin1要改變服務器的編碼必須重新啓動服務器,我們先用mysqladmin –uroot shutdown關閉服務器,然後mysqld –C GBK啓動服務器 –C是character_set_server的一個簡寫(可以也可以寫成mysqld –character_set_server gbk).這樣修改以後我們再進入mysql查看就會顯示:

這樣我們就把服務器和數據庫的編碼改爲了GBK。
現在我們就可以插入中文字符串了,但是爲什麼有時間還是會顯示
Exception in thread "main" com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'name' at row 1
這是因爲你只是修改了mysql的服務器的字符編碼,並沒有修改已經有數據庫的編碼,這時候你需要手動的把data目錄下的數據庫中的db.opt中的編碼改爲
default-character-set=gbk
default-collation=gbk_chinese_ci
這樣修改以後你在重啓服務器就可以插入中文了。
但是這時候還有個問題就是在你應用程序當中顯示的是中文字符,但是在命令窗口還是亂碼。
這時候你注意我們上面圖中的character_set_client字符還是latin1當然顯示的是亂碼咯喲。所以你進入mysql客戶端程序的時候因該把客戶端默認的編碼改爲gbk才能顯示正常。
你可以在mysql裏修改,也可以在登陸的時候mysql –uroot –default-character-set=gbk修改
如此以來就解決了中文問題了。
我剛開始的時候在程序中加入了一個characterEncoding變量(下圖),但是想來想去都覺得這個變量沒什麼用,所以後來去掉也能顯示正常。
jdbc:mysql://127.0.0.1:3306/ee?characterEncoding=gbk"


 

第三種方法,說有太複雜了,反到不知道怎麼弄了,你試試,也許可以用得上

1.修改/etc/my.cnf文件,改成這樣:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
default-character-set=utf8
[mysql.server]
user=mysql
basedir=/var/lib
[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
注意:就是加入了一句default-character-set=utf8。
2./etc/init.d/mysqld restart 重新啓動mysql;
3.打開phpmyadmin,選擇lang爲"Chines simplifies(zh-utf-8)",選擇"MySQL 連接校對"爲"utf8_general_ci "點“顯示 MySQL 的運行信息”--“變量”,可以看到:
character set client utf8 utf8
character set connection utf8 utf8
character set database utf8 utf8
character set results utf8 utf8
character set server utf8 utf8
character set system utf8 utf8
collation connection utf8_general_ci utf8_general_ci
collation database utf8_general_ci utf8_general_ci
collation server utf8_general_ci utf8_general_ci
從這裏可以看到character全部變成utf8了。
有人要問,爲什麼都要改成utf8呢?改成GB2312不行嗎?
解釋如下:
我也不想改成utf8,只是phpmyadmin2.6在mysql4.1的時候只會用utf8,連其他頁面的charset也都是utf8,改成gb2312一定會亂碼,我們只能湊phpmyadmin了。
只有在mysql3.23的時候,phpmyadmin纔會多一個gb2312的頁面charset,這時候是正常的。
3.將以前的mysql3的庫文件導入mysql4.1的庫
有兩種情況:
一是從phpmyadmin上導入,這時候你要注意的是在選擇庫文件的頁面左下腳有個“文件的字符集:”,默認是utf8,要改成gb2312,否則導進去亂碼;
二是在linux下導入,這時候你需要先在庫文件的頭部加一行:
SET NAMES 'gb2312'; 注意最後也是;號,別漏了。
然後執行mysql -u用戶名 -p密碼 xxx.sql > 庫名
導入完成以後再用phpmyadmin打開看,裏面的中文字就是正確的。
4.從mysql4.1裏導出庫文件
一.用phpmyadmin導出
導出倒是問題不大,如果phpmyadmin的瀏覽頁面裏顯示的中文是正常的,那麼導出肯定也是正常的
二.在linux上導出
如果用mysqldump導出出現了亂碼也沒有關係,可以運行iconv來轉換一下
iconv -c -f UTF-8 -t GB2312 庫文件名 > 新的gb2312的庫文件名
綜上所述,你要注意:
1。儘量在需要導入的庫文件的開頭加入SET NAMES 'gb2312';告訴mysql你要導入的是一個gb2312的文件;
2。可能你需要這個:
SET NAMES 'utf8';
在登陸到mysql後用,把character的一些默認參數改到utf8上,有時可以減少一些困擾,不過也不是必須的。
在mysql上使用:
SHOW VARIABLES LIKE 'character_set_%';
用來查看當前的狀態。
3.如果出現亂碼也不要怕,一是你要注意留存原有的備份,二是用iconv來進行轉化。
在正常使用之前注意做導入導出的測試,確保萬無一失。

我升級了MYSQL到4.1.2,phpmyadmin用的是2.6.2。數據表裏面有中文的字段中文都變成了亂碼,導出數據也是亂碼。我用以前的2.5.7沒有問題,想問一下,應該在phpmyadmin的那個文件裏改哪個設置一下才能顯示出來的是正常的中文字?
和字符相關的變量中這幾個和sql很有關係:
character_set_client
character_set_connection
character_set_results
此外就是數據庫中對相應字段設置的charact set,如果沒有對字段設置,缺省是table的charact set,table也沒有指定則缺省使用database的。
上面3個變量的作用是這樣的,client表示客戶端發送過來的字符集,results表示發送到客戶端的字符集(這兩個分開是因爲發送過來和發送過去的不一定是同一個客戶端),connection則在客戶端和數據庫起一個連接作用。
具體是這樣:比如我在mysql命令行設置client爲gbk,connection爲utf8,results爲gbk,數據庫爲big5,
當我發送一個insert語句的時候,這個語句作爲gbk代碼,先轉爲utf8代碼(connection),再轉爲big5(database)插入數據庫。
而運行一個select語句的時候,從數據庫得到的結果則相反的過程,由big5轉爲utf8,再轉爲gbk,你得到gbk的結果。
因此最主要的是讓client和results和你使用的客戶端一致。比如你的網頁是utf8編碼,你就要設置這兩個爲utf8。
而在mysql命令行的時候,我用的是2000,需要設置爲gbk
而我們用的set names XXX,實際上就是同時設置這3個變量爲XXX。
在這樣的情況下,我們可以把一個數據庫中的不同表或不同字段設爲不同的字符集,只要上面3個設置正確,就可以在數據庫中同時使用不同的字符集。
注意要保證你的數據庫中的字符已經使用了正確的字符集,比如如果一開始你設置錯誤,插入數據後,本身數據的編碼就是不正確的,然後即使設置改回來,也不可能得到正確的顯示了。

希望對大家有所幫助


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章