从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如下:
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 ソフトウェア