《MYSQL教程MySQL的中文UTF8亂碼問題》要點:
本文介紹了MYSQL教程MySQL的中文UTF8亂碼問題,希望對您有用。如果有疑問,可以聯系我們。
從MySQL支持Unicode后,為了與時俱進,我們的web程序也開始考慮用UTF8了.其實UTF8也用了好幾年了,程序基本能跑,沒什么大問題,但是數據倒換的時候,總是遇到不爽的事情.MYSQL必讀
【問題現象】MYSQL必讀
網頁xxx.php用EditPlus另存為UTF8格式,MySQL在my.ini里設置default-character-set=utf8,建表時加了CREATE TABLE `xxx ` (myname varchar(255)) ENGINE=MyISAM DEFAULT CHARSET=utf8,用xxx.php執(zhí)行insert/update/select出來的都是中文,貌似沒問題,但是用phpMyAdmin看select是亂碼,用第三方工具軟件(如SQLyog)看select也是亂碼,mysqldump也是亂碼,很不爽.當然,如果你建表的時候,選擇了binary/varbinary/blob類型,不會發(fā)現亂碼,因為指定的是二進制保存,MySQL保存數據時就沒有編碼的概念了.MYSQL必讀
【查找問題】MYSQL必讀
雖然在my.ini里設置default-character-set=utf8,但是執(zhí)行以下命令時有新發(fā)現:MYSQL必讀
mysql> SHOW VARIABLES LIKE 'character%';MYSQL必讀 +----------------------------------------+-------------------------MYSQL必讀 | Variable_name??????????? | ValueMYSQL必讀 +----------------------------------------+-------------------------MYSQL必讀 | character_set_client???????| latin1MYSQL必讀 | character_set_connection ??| latin1MYSQL必讀 | character_set_database????| utf8MYSQL必讀 | character_set_filesystem ???| binaryMYSQL必讀 | character_set_results??? ???| latin1MYSQL必讀 | character_set_server???? ??| utf8MYSQL必讀 | character_set_system??? ??| utf8MYSQL必讀 | character_sets_dir?????? ??| D:\mysql\share\charsets\MYSQL必讀 +----------------------------------------+-------------------------MYSQL必讀 8 rows in set (0.00 sec)MYSQL必讀 ?MYSQL必讀 mysql> SHOW VARIABLES LIKE 'collation_%';MYSQL必讀 +---------------------------------------+------------------MYSQL必讀 | Variable_name????? ?????| Value??????????? MYSQL必讀 +---------------------------------------+------------------MYSQL必讀 | collation_connection ????| latin1_swedish_ciMYSQL必讀 | collation_database?? ????| utf8_general_ci?MYSQL必讀 | collation_server???? ????| utf8_general_ci?MYSQL必讀 +--------------------------------------+------------------MYSQL必讀 3 rows in set (0.00 sec)MYSQL必讀 |
發(fā)現Value列里面不全是utf8,仍然有部分是latin1,比如其中的client和connection.那網頁xxx.php的工作過程就是這樣的啦:從xxx.php頁面上輸入漢字,因為xxx.php是UTF8編碼的,所以xxx.php以UTF8格式轉換輸入的漢字,然后以UTF8提交給mysql,但是mysql的client和connection都是latin1的,而表是UTF8的,所以mysql存儲時,先將xxx.php提交的漢字,轉成latin1的格式,再轉成UTF8字符格式存在表中.如果此時我們用第三方軟件或者phpMyAdmin去select查看此表,而表中存儲的數據是被latin1過的UTF8字符,出來的時候是以UTF8格式取的,當然看起來時亂碼了.解決方法就是讓所有過程都是UTF8的就可以了.MYSQL必讀
【解決問題】MYSQL必讀
1、從my.ini下手MYSQL必讀
[client]MYSQL必讀 default-character-set=utf8MYSQL必讀 [mysql]MYSQL必讀 default-character-set=utf8MYSQL必讀 [mysqld]MYSQL必讀 default-character-set=utf8MYSQL必讀 |
以上3個section都要加default-character-set=utf8,平時我們可能只加了mysqld一項.MYSQL必讀
然后重啟mysql,執(zhí)行MYSQL必讀
mysql> SHOW VARIABLES LIKE 'character%';MYSQL必讀
mysql> SHOW VARIABLES LIKE 'collation_%';MYSQL必讀
確保所有的Value項都是utf8即可.MYSQL必讀
2、建表時加utf8,表字段的Collation可加可不加,不加時默認是utf8_general_ci了.MYSQL必讀
CREATE TABLE `tablename4` (MYSQL必讀 `id` int(11) NOT NULL AUTO_INCREMENT,MYSQL必讀 `varchar1` varchar(255) DEFAULT NULL,MYSQL必讀 `varbinary1` varbinary(255) DEFAULT NULL,MYSQL必讀 PRIMARY KEY (`id`)MYSQL必讀 ) ?ENGINE=MyISAM ?DEFAULT CHARSET=utf8 MYSQL必讀 |
?MYSQL必讀
3、網頁xxx.php保存時選擇utf8編碼,頁頭最好加上MYSQL必讀
header('conten-type:text/html;charset=utf-8');MYSQL必讀
在執(zhí)行CRUD操作前先執(zhí)行一下MYSQL必讀
mysql_query("set names utf8");MYSQL必讀
測試代碼xxx.php如下:MYSQL必讀
<?phpMYSQL必讀 header('conten-type:text/html;charset=utf-8');MYSQL必讀 mysql_connect("localhost", "root", "password") or die("Could not connect: " . mysql_error());MYSQL必讀 mysql_select_db("test");MYSQL必讀 mysql_query("set names utf8");MYSQL必讀 $str = "CHN 軟件開發(fā)有限公司,JPN ソフトウェア_k株式會社,KOR ????? ?? ?? ??,RUS Суд программного обеспечения".time();MYSQL必讀 $sql = "insert into tablename4 (varchar1, varbinary1 ) values ('".$str."','".$str."')";MYSQL必讀 echo $sql."<hr>";MYSQL必讀 mysql_query($sql);MYSQL必讀 ?MYSQL必讀 $result = mysql_query("SELECT id, varchar1 ,varbinary1 FROM tablename4");MYSQL必讀 while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {MYSQL必讀 printf ("ID: %s , varchar1: %s, varbinary1: %s<br>", $row[0], $row["varchar1"], $row["varbinary1"]);MYSQL必讀 }MYSQL必讀 ?MYSQL必讀 mysql_free_result($result);MYSQL必讀 ?>MYSQL必讀 |
如此設置之后,無論是在php頁面插入任何utf8字符,在php頁面里取出來的,在phpMyAdmin里取出來的,在mysql的第三方客戶端軟件里取出來的,都是一樣的漢字了,不會再發(fā)現亂碼,mysqldump出來的也是漢字.OK,問題解決.MYSQL必讀
【另】在中文windows系統(tǒng)下,在cmd.exe里運行mysql.exe字符終端,不能使用上面的規(guī)則,因為默認情況下,中文windows系統(tǒng)cmd.exe里的代碼頁是cp936即GBK,不能顯示全部UTF8字符,所以在字符終端里看到亂碼是正常現象,不要奇怪,這個問題在類Unix系統(tǒng)的shell終端里可以解決的.MYSQL必讀
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/1042.html