MYSQL使用UTF8中文乱码终极解决办法

转自:http://wenku.baidu.com/view/d2d4f15ba8114431b80dd81f.html

MYSQL使用UTF8中文乱码终极解决办法  
作者:刘明灵 [email protected]  2009.8  
MYSQL乱码的问题主要有几个环节决定,一个是前端网页;二是字符传输;三是连接MYSQL;四是MYSQL的存贮方式。  
MYSQL的缺省字符集为latin1;如果不做任何处理,则存贮方式为latin;此时虽然在PHP程序中设置set names 'utf8',可以正确存取中文;但其实utf8的字符按照latin1来存贮,占用的字节数差不多翻倍。这样的方式,本质上是按照乱码存放,读取的时候再还原,是不太可取的。  
我们要做的是实现前端UTF-8,传输UTF-8,接口UTF8,存贮UTF8。  
1、前端问题:网页和PHP程序存贮为UTF-8格式;网页中指定编码格式:    
2、传输问题:apache的配置 
vim /etc/apache2/conf.d/charset  AddDefaultCharset UTF-8  
3、MYSQL的连接和存贮问题:修改MYSQL配置 vim /etc/mysql/my.cnf  [client] 
 default-character-set = utf8  [mysqld] 
 character-set-server=utf8 
 collation-server=utf8_general_ci  skip-character-set-client-handshake  [mysql] 
 default-character-set = utf8  








          








    void function(e,t){for(var n=t.getElementsByTagName("img"),a=+new Date,i=[],o=function(){this.removeEventListener&&this.removeEventListener("load",o,!1),i.push({img:this,time:+new Date})},s=0;s< n.length;s++)!function(){var e=n[s];e.addEventListener?!e.complete&&e.addEventListener("load",o,!1):e.attachEvent&&e.attachEvent("onreadystatechange",function(){"complete"==e.readyState&&o.call(e,o)})}();alog("speed.set",{fsItems:i,fs:a})}(window,document);








 
注1:MySQL官方建议 [mysqld] 的部份应该要使用 character-set-server 与 collation-server 等选项, 
而不是使用 default-character-set,因为此选项已经是 deprecated。  
注2:skip-character-set-client-handshake是忽略客户端的字符集,使用服务器的设置;这样就使得接口也是UTF8;很多人建议在PHP程序中, 
在连接数据库时设置mysql_query("set names 'utf8'");或者在my.cnf中配置init-connect='SET NAMES utf8'(仅对非超级用户有效); 
其实这里配置skip-character-set-client-handshake是最简洁有效的,客户端可以不做任何处理。  
注3:[client]配置客户端部分,用于服务器本地维护;[mysql]配置MYSQL启动条件。  
重启mysql 
/etc/init.d/mysql restart 进入MYSQL,查看配置是否正确: 
 
 mysql> show variables like 'character_set_%'; 
 +--------------------------+----------------------------+  | Variable_name            | Value                      | 
 +--------------------------+----------------------------+  | character_set_client     | utf8                       |   | character_set_connection | utf8                       |   | character_set_database   | utf8                       |   | character_set_filesystem | binary                     |   | character_set_results    | utf8                       |   | character_set_server     | utf8                       |   | character_set_system     | utf8                       |  
 | character_sets_dir       | /usr/share/mysql/charsets/ |  








 var cpro_psid ="u2572954"; var cpro_pswidth =966; var cpro_psheight =120;














 +--------------------------+----------------------------+  8 rows in set (0.00 sec)   
 mysql> show variables like 'collation_%';  +----------------------+-----------------+  | Variable_name        | Value           |  +----------------------+-----------------+  | collation_connection | utf8_general_ci |   | collation_database   | utf8_general_ci |   | collation_server     | utf8_general_ci |   +----------------------+-----------------+  3 rows in set (0.00 sec)   
MYSQL创建库和表的时候,都不要指定编码格式。此时MYSQL数据库的编码格式为utf8_general_ci ,表格式也是utf8_general_ci,中文字段也是用utf8_general_ci  
实现以上步骤,则网页、phpmyadmin都不是乱码。而且phpmyadmin导出中文均为正常可见的字符。  
如果在此之前使用了不正确的配置,那么转换到新的正确配置,之前的内容会出现乱码,所以需要注意做旧数据保存和重新导入。   
有两篇文章论述比较清晰,对于理解这些有帮助: 
 
http://www.adsenseor.com/mysql/256.html  
http://php.tmacn.cn/tmacn/20090516112.html  
------------------------------------------------------------- 参考: 
http://www.adsenseor.com/mysql/256.html http://php.tmacn.cn/tmacn/20090516112.html 







          








    void function(e,t){for(var n=t.getElementsByTagName("img"),a=+new Date,i=[],o=function(){this.removeEventListener&&this.removeEventListener("load",o,!1),i.push({img:this,time:+new Date})},s=0;s< n.length;s++)!function(){var e=n[s];e.addEventListener?!e.complete&&e.addEventListener("load",o,!1):e.attachEvent&&e.attachEvent("onreadystatechange",function(){"complete"==e.readyState&&o.call(e,o)})}();alog("speed.set",{fsItems:i,fs:a})}(window,document);








 
注1:MySQL官方建议 [mysqld] 的部份应该要使用 character-set-server 与 collation-server 等选项, 
而不是使用 default-character-set,因为此选项已经是 deprecated。  
注2:skip-character-set-client-handshake是忽略客户端的字符集,使用服务器的设置;这样就使得接口也是UTF8;很多人建议在PHP程序中, 
在连接数据库时设置mysql_query("set names 'utf8'");或者在my.cnf中配置init-connect='SET NAMES utf8'(仅对非超级用户有效); 
其实这里配置skip-character-set-client-handshake是最简洁有效的,客户端可以不做任何处理。  
注3:[client]配置客户端部分,用于服务器本地维护;[mysql]配置MYSQL启动条件。  
重启mysql 
/etc/init.d/mysql restart 进入MYSQL,查看配置是否正确: 
 
 mysql> show variables like 'character_set_%'; 
 +--------------------------+----------------------------+  | Variable_name            | Value                      | 
 +--------------------------+----------------------------+  | character_set_client     | utf8                       |   | character_set_connection | utf8                       |   | character_set_database   | utf8                       |   | character_set_filesystem | binary                     |   | character_set_results    | utf8                       |   | character_set_server     | utf8                       |   | character_set_system     | utf8                       |  
 | character_sets_dir       | /usr/share/mysql/charsets/ |  








 var cpro_psid ="u2572954"; var cpro_pswidth =966; var cpro_psheight =120;














你可能感兴趣的:(MySQL)