MySQL的中文UTF8亂碼成績。本站提示廣大學習愛好者:(MySQL的中文UTF8亂碼成績)文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL的中文UTF8亂碼成績正文
從MySQL支撐Unicode後,為了與時俱進,我們的web法式也開端斟酌用UTF8了。其實UTF8也用了好幾年了,法式根本能跑,沒甚麼年夜成績,然則數據倒換的時刻,老是碰到不爽的工作。
【成績景象】
網頁xxx.php用EditPlus另存為UTF8格局,MySQL在my.ini裡設置default-character-set=utf8,建表時加了CREATE TABLE `xxx ` (myname varchar(255)) ENGINE=MyISAM DEFAULT CHARSET=utf8,用xxx.php履行insert/update/select出來的都是中文,貌似沒成績,然則用phpMyAdmin看select是亂碼,用第三方對象軟件(如SQLyog)看select也是亂碼,mysqldump也是亂碼,很不爽。固然,假如你建表的時刻,選擇了binary/varbinary/blob類型,不會發明亂碼,由於指定的是二進制保留,MySQL保留數據時就沒有編碼的概念了。
【查找成績】
固然在my.ini裡設置default-character-set=utf8,然則履行以下敕令時有新發明:
mysql> SHOW VARIABLES LIKE 'character%';
+----------------------------------------+-------------------------
| Variable_name | Value
+----------------------------------------+-------------------------
| character_set_client | latin1
| character_set_connection | latin1
| character_set_database | utf8
| character_set_filesystem | binary
| character_set_results | latin1
| character_set_server | utf8
| character_set_system | utf8
| character_sets_dir | D:\mysql\share\charsets\
+----------------------------------------+-------------------------
8 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation_%';
+---------------------------------------+------------------
| Variable_name | Value
+---------------------------------------+------------------
| collation_connection | latin1_swedish_ci
| collation_database | utf8_general_ci
| collation_server | utf8_general_ci
+--------------------------------------+------------------
3 rows in set (0.00 sec)
發明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的便可以了。
【處理成績】
1、從my.ini下手
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8
以上3個section都要加default-character-set=utf8,日常平凡我們能夠只加了mysqld一項。
然後重啟mysql,履行
mysql> SHOW VARIABLES LIKE 'character%';
mysql> SHOW VARIABLES LIKE 'collation_%';
確保一切的Value項都是utf8便可。
2、建表時加utf8,表字段的Collation可加可不加,不加時默許是utf8_general_ci了。
CREATE TABLE `tablename4` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`varchar1` varchar(255) DEFAULT NULL,
`varbinary1` varbinary(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
3、網頁xxx.php保留時選擇utf8編碼,頁頭最好加上
header('conten-type:text/html;charset=utf-8');
在履行CRUD操作前先履行一下
mysql_query("set names utf8");
測試代碼xxx.php以下:
<?php
header('conten-type:text/html;charset=utf-8');
mysql_connect("localhost", "root", "password") or die("Could not connect: " . mysql_error());
mysql_select_db("test");
mysql_query("set names utf8");
$str = "CHN 軟件開辟無限公司,JPN ソフトウェア開発股份有限公司,KOR 소프트웨어 개발 유한 공사,RUS Суд программного обеспечения".time();
$sql = "insert into tablename4 (varchar1, varbinary1 ) values ('".$str."','".$str."')";
echo $sql."<hr>";
mysql_query($sql);
$result = mysql_query("SELECT id, varchar1 ,varbinary1 FROM tablename4");
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
printf ("ID: %s , varchar1: %s, varbinary1: %s<br>", $row[0], $row["varchar1"], $row["varbinary1"]);
}
mysql_free_result($result);
?>
如斯設置以後,不管是在php頁面拔出任何utf8字符,在php頁面裡掏出來的,在phpMyAdmin裡掏出來的,在mysql的第三方客戶端軟件裡掏出來的,都是一樣的漢字了,不會再發明亂碼,mysqldump出來的也是漢字。OK,成績處理。
【另】在中文windows體系下,在cmd.exe裡運轉mysql.exe字符終端,不克不及應用下面的規矩,由於默許情形下,中文windows體系cmd.exe裡的代碼頁是cp936即GBK,不克不及顯示全體UTF8字符,所以在字符終端裡看到亂碼是正常景象,不要奇異,這個成績在類Unix體系的shell終端裡可以處理的。