從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 ソフトウェア 主站蜘蛛池模板: 潍坊市| 高阳县| 攀枝花市| 柳河县| 那曲县| 盈江县| 辽阳县| 明溪县| 长治市| 凤山市| 鱼台县| 瓦房店市| 合江县| 嘉荫县| 大悟县| 南澳县| 九江县| 彭泽县| 洞头县| 漾濞| 弥勒县| 无为县| 桦甸市| 枝江市| 剑河县| 开原市| 商城县| 济南市| 兰坪| 泸溪县| 辽阳市| 尼勒克县| 乌海市| 康乐县| 宝清县| 金塔县| 孙吴县| 元氏县| 绥宁县| 文登市| 芜湖县| |