MYSQL使用UTF8中文乱码终极解决办法MYSQL使用UTF8中文乱码终极解决办法.pdf
文本预览下载声明
MYSQL使用UTF8中文乱码终极解决办法
作者:刘明灵 liumingling@ 2009.8
MYSQL乱码的问题主要有几个环节决定,一个是前端网页;二是字符传输;三是连接
MYSQL;四是MYSQL的存贮方式。
MYSQL的缺省字符集为latin1;如果不做任何处理,则存贮方式为latin;此时虽
然在PHP程序中设置set names utf8,可以正确存取中文;但其实utf8的字符
按照latin1来存贮,占用的字节数差不多翻倍。这样的方式,本质上是按照乱码存
放,读取的时候再还原,是不太可取的。
我们要做的是实现前端UTF-8,传输UTF-8,接口UTF8,存贮UTF8。
1、前端问题:网页和PHP程序存贮为UTF-8格式;网页中指定编码格式:
meta http-equiv=Content-Type content=text/html;
charset=UTF-8 /
2、传输问题:apache的配置
vim /etc/apache2/conf.d/charset
AddDefaultCharset UTF-8
3、MYSQL的连接和存贮问题:修改MYSQL配置
vim /etc/mysql/f
[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
注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);或者在f中配
置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/ |
+++
8 rows in set (0.00 sec)
mysql show variables like collation_%;
+++
| Variable_name | Value
显示全部