MySQL的中文UTF8乱码问题
{问题现象}
xxx.php EditPlus保存为UTF8格式,MySQL设置默认字符集= utf8在my.ini,与创建的表` XXX(名字` varchar(255))= MyISAM引擎默认的字符集utf8,xxx.php执行插入/更新/选择似乎是没有问题的,但phpMyAdmin选择是乱码,与第三方工具软件(如SQLyog)在选择是乱码,mysqldump是乱码,很不舒服。当然,如果你选择二进制 / / varbinary BLOB类型当你建立的表,你不会找到乱码,因为指定的一个二进制保存,并没有编码的概念,当MySQL保存数据。
{查找问题}
虽然默认字符集= utf8设置my.ini,有新发现时,执行如下命令:
MySQL >显示变量like'character %;
+ ---------------------------------------- + -------------------------
| variable_name |价值
+ ---------------------------------------- + -------------------------
| character_set_client | latin1
| character_set_connection | latin1
| character_set_database | UTF8
| character_set_filesystem |二进制
| character_set_results | latin1
| character_set_server | UTF8
| character_set_system | UTF8
| character_sets_dir | D: 共享MySQL字符集
+ ---------------------------------------- + -------------------------
8行(0秒)
MySQL >显示变量like'collation_ %;
+ --------------------------------------- + ------------------
| variable_name |价值
+ --------------------------------------- + ------------------
| collation_connection | latin1_swedish_ci
| collation_database | utf8_general_ci
| collation_server | utf8_general_ci
+ -------------------------------------- + ------------------
3行(0秒)
发现价值列不都是UTF8,还有latin1的某些部分,如客户端连接。工作过程是这样的:xxx.php:从xxx.php页输入汉字,因为xxx.php是UTF8编码,所以,xxx.php UTF8格式转换为文本输入汉字,然后提交给MySQL,但MySQL客户端连接latin1,和桌子是UTF8,所以MySQL存储,xxx.php首次提出汉字转换成latin1格式,然后转成utf8字符格式的表。如果我们使用第三方软件或phpMyAdmin去选择看这表,在表中存储的数据是UTF8字符,通过latin1。出来的时候,它是采取UTF8格式。当然,它看起来是随机的。解决的办法是使所有进程UTF8。
{解决问题}
1。从my.ini
{客户}
默认字符集= utf8
{ MySQL }
默认字符集= utf8
{他}
默认字符集= utf8
以上3部分要添加默认字符集= UTF8,通常我们可以只添加一个mysqld。
然后重新启动MySQL,执行
MySQL >显示变量like'character %;
MySQL >显示变量like'collation_ %;
确保所有的物品价值是UTF8。
2、当建表是用UTF8,表的字段的排序规则不能增加,而默认是没有时间utf8_general_ci。
创建表(` tablename4 `
` ID ` int(11)不为空auto_increment,
` varchar1 ` varchar(255)默认为空,
` varbinary1 ` varbinary(255)默认为空,
主键(id)
)= MyISAM引擎默认的字符集utf8
3、xxx.php保存UTF8编码的标题,最好加
头('conten-type:文本/ HTML;字符集= UTF-8);
执行CRUD操作之前执行它
mysql_query(SET NAMES UTF8);
测试代码xxx.php如下:
< PHP
头('conten-type:文本/ HTML;字符集= UTF-8);
mysql_connect(localhost
mysql_select_db(测试);
mysql_query(SET NAMES UTF8);
$str =CHN软体开发资讯公司,JPN,评估人类发展公司,韩国,俄罗斯,还有一些来自T,M. M从C·节能E C E确定现场的第一部分(时间);
为SQL =插入tablename4(varchar1,varbinary1)值(,、结构元。和美元);
sql $。;
mysql_query($ SQL);
结果= mysql_query美元(选择ID,varchar1,varbinary1从tablename4 );
而($行= mysql_fetch_array(美元的结果,mysql_both)){
printf(ID:%s,varchar1:%s,varbinary1:%s
}
mysql_free_result($结果);
>
这样设置后,它被插入在PHP页面的任何字符UTF8,带它的PHP页面,在phpMyAdmin,取出MySQL第三方客户端软件,是相同的汉字,从来没有发现也是乱码,就中国characters.ok,问题就解决了。
{等}在中文Windows系统,在cmd.exe运行mysql.exe字符终端,不能使用上述规则,因为默认情况下,中文Windows系统cmd.exe代码页cp936或GBK,显示所有utf8的字符,所以垃圾是正常现象,在字符终端不奇怪,这个问题可以解决在shell终端在UNIX系统。