Mysql 4.1.x 和 Mysql 5 的乱码问题及解决办法
[ 2006-06-11 03:35:21 | 作者: admin ]
======简单的说=============================================================
mysql5支持多种编码方式,只要存入的和读取的编码一致就不会再产生乱码,如都为gb2312。
1.在网页中指明编码gb2312
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
2.php程序中在执行SQL语句前先执行以下语句:
实际上可以在打开连接后就紧接着运行下面一句代码(GB2312可以根据实际情况变动)
mysql_query("SET NAMES 'GB2312'");
2.修改apache配置文件httpd.conf
AddDefaultCharset GB2312
3.修改mysql5配置文件my.ini
default_character_set = gb2312
==========================================================================
/**********************************/
/*讨论乱码过程 */
/**********************************/
从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章"Character Set Support"后终于找到了解决方法并测试通过。
MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:
QUOTE:
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
上面列出的值就是系统的默认值。(很奇怪系统怎么默认是latin1的瑞典语排序方式)...
当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES 'utf8';
它相当于下面的三句指令:
QUOTE:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
再试试看,正常了吧?
就是连接之后加个查询
QUOTE:
$this->query(”SET NAMES ‘utf8′”);
看了手册第10章觉得主要还是Character Sets的问题。
character_set_client,character_set_results,character_set_connection三个运行变量是造成乱码的关键。mysql把客户端提交的查询由character_set_client转换为character_set_connection
,由于默认网页提交的查询是gb2312(表单页面meta里可以看到),而mysql默认将其当作utf8(可以查到此时的character_set_client=utf8),所以必然乱码。同理,mysql返回的结果是已经转换成character_set_results编码的(与表的编码无关),同样默认是utf8,而网页页面把它当gb2312处理,所以必然有标题等由数据库读出的字段是乱码而其他部门文字不乱码的现象。
以上这个例子是utf8字符集,用此方法,设置为gbk,即可解决
mysql5支持多种编码方式,只要存入的和读取的编码一致就不会再产生乱码,如都为gb2312。
1.在网页中指明编码gb2312
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
2.php程序中在执行SQL语句前先执行以下语句:
实际上可以在打开连接后就紧接着运行下面一句代码(GB2312可以根据实际情况变动)
mysql_query("SET NAMES 'GB2312'");
2.修改apache配置文件httpd.conf
AddDefaultCharset GB2312
3.修改mysql5配置文件my.ini
default_character_set = gb2312
==========================================================================
/**********************************/
/*讨论乱码过程 */
/**********************************/
从MySQL 4.1开始引入的多语言支持确实很棒,而且一些特性已经超过了其他的数据库系统。不过我在测试过程中发现使用适用于MySQL 4.1之前的PHP语句操作MySQL数据库会造成乱码,即使是设置过了表字符集也是如此。我读了一下新的MySQL在线手册中第十章"Character Set Support"后终于找到了解决方法并测试通过。
MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character set)和排序方式(Collation)。对于字符集的支持细化到四个层次: 服务器(server),数据库(database),数据表(table)和连接(connection)。
查看系统的字符集和排序方式的设定可以通过下面的两条命令:
QUOTE:
mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
上面列出的值就是系统的默认值。(很奇怪系统怎么默认是latin1的瑞典语排序方式)...
当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:
SET NAMES 'utf8';
它相当于下面的三句指令:
QUOTE:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;
再试试看,正常了吧?
就是连接之后加个查询
QUOTE:
$this->query(”SET NAMES ‘utf8′”);
看了手册第10章觉得主要还是Character Sets的问题。
character_set_client,character_set_results,character_set_connection三个运行变量是造成乱码的关键。mysql把客户端提交的查询由character_set_client转换为character_set_connection
,由于默认网页提交的查询是gb2312(表单页面meta里可以看到),而mysql默认将其当作utf8(可以查到此时的character_set_client=utf8),所以必然乱码。同理,mysql返回的结果是已经转换成character_set_results编码的(与表的编码无关),同样默认是utf8,而网页页面把它当gb2312处理,所以必然有标题等由数据库读出的字段是乱码而其他部门文字不乱码的现象。
以上这个例子是utf8字符集,用此方法,设置为gbk,即可解决
[最后修改由 admin, 于 2006-10-10 01:25:29]
评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=643
这篇日志没有评论。
此日志不可发表评论。