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,但是执⾏以下命令时有新发现:
sqlyog注册码在哪输入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系统下,在⾥运⾏字符终端,不能使⽤上⾯的规则,因为默认情况下,中⽂windows系统⾥的代码页是cp936即GBK,不能显⽰全部UTF8字符,所以在字符终端⾥看到乱码是正常现象,不要奇怪,这个问题在类Unix系统的shell终端⾥可以解决的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。