MYSQL4.1下的网站乱码问题解决方法

来源:互联网 发布:手机不允许安装软件 编辑:程序博客网 时间:2024/06/07 07:38
MYSQL4.1下的网站乱码问题解决方法,涉及到字符编码GBK和UTF-8,以及数据库软件mysql的版本。

MYSQL4.1下的网站乱码问题解决方法      
 
--摘自曼波驰誉(http://www.allknow.cn)
(略有修改和简化)

网站成功转移,碰上了这个问题,以下是详细解决方法,有类似或同样困境的朋友可以参考一下。

1:空间信息

新空间PHP信息如下:

PHP built On:  略
Database Version:  4.1.20 
PHP Version:  4.3.9 
Web Server:  Apache/2.0.52 (Red Hat) 
WebServer to PHP interface:  apache2handler 
Joomla! Version:  Joomla! 1.0.12 Stable [ Sunfire ] 25 December 2006 01:00 UTC 
......

原空间PHP信息如下:

PHP built On:  略 
Database Version:  4.0.25-standard-log 
PHP Version:  4.3.11 
Web Server:  Apache/1.3.34 (Unix) mod_gzip/1.3.26.1a mod_auth_passthrough/1.8 mod_log_bytes/1.2 mod_bwlimited/1.4 PHP/4.3.11 FrontPage/5.0.2.2635 
WebServer to PHP interface:  apache 
Joomla! Version:  Joomla! 1.0.12 Stable [ Sunfire ] 25 December 2006 01:00 UTC 
......
2:出现的问题:
通过phpmyadmin导出在原空间的数据库,重新导入到新空间数据库里,一次ok,无报错提示。尽管导出的sql文件是utf8编码,但在新数据库里查看内容条目全是乱码,前台浏览器utf8编码下,内容除了语言文件里的中文文字外,所有内容条目都是乱码,惨不忍睹。
 
3:乱码原因分析

现在多数host装的还是MySQL 4.0x 版本以下,如果升级到了4.1x 或者移动到使用4.1x 的主机上,估计会遇到一些问题。有很多国外主机用的Mysql是4.x系列的,感觉还比较好,都无论GBK和UTF-8都没有乱码,新的主机的Mysql是5.0版本的,导入数据后,用Php读出来全是问号,乱码一片,记得我以前也曾经有过一次切换出现乱码的经验,原因肯定是Mysql版本之间的差异问题。

一是数据导入。在phpMyAdmin内导入后,发现中文变成了乱码。搜索学习后,了解到需要设置数据库的collation (校勘),如果你的数据库是utf-8的,设置为utf8_general_ci就可以了。

二是,即使正确导入了,在phpMyAdmin里也能正确显示,但joomla页面上显示的文章内容都是“???”,而模板里面的汉字都能正常显示。这让我头疼了很久。搜索到有对此的说明:

从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)。

当我们按照原来的方式通过PHP存取MySQL数据库时,就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

SET NAMES ‘utf8′;

但是我依旧不知道,如何,在何处让joomla运行这个SQL语句。但是觉得这个经验会对别人有用。记得有人用email和我讨论过这样子的中文显示问题,但是我那时哪里知道问题出在MySQL 4.1x上。比如在win2k下面使用的是mysql4.1,php5.0.3都是乱码。开源软件还是用稳定的老版本较好,各种系统都兼容。用mysql4.0.23和php4.3.10。

4:有效解决方法

1 先说我这次转换空间乱码解决方法,对了,我主系统用的是joomla! 1.0.12英文原版。首先打开你导出的那个sql文件,在最上面添加SET NAMES utf8; 然后搜索到TYPE=MyISAM 有的可能是TYPE=MyISAM DEFAULT CHARSET=latin1 全部替换成TYPE=MyISAM DEFAULT CHARSET=utf8 以utf8编码保存后重新导入到新空间的数据库里,这样从数据库里查看到的内容都是正常中文显示了,但前台还是一片乱码,似乎问题没有找到根源。这里把这个步骤写上,只是说明我的确这样操作过,并且还有些效果。

经过艰苦的查找资料 搜索 尝试,终于发现了解决乱码的最后一道门。请打开includes下的database.php文件,找到102行的代码

//@mysql_query("SET NAMES 'utf8'", $this->_resource);

将前面的注释去掉变成

mysql_query("SET NAMES 'utf8'", $this->_resource);

保存上传,查看网站前台,一切正常,再无乱码出现。没想到该版本的程序里已经考虑到这个问题了,只需去掉两个字符即可解决问题!

5:另一个解决方法:

我在网上还看到了另一个乱码解决方法,不知道是针对什么版本的,我没有测试过,供大家参考。该方法如下

原作者gudai [原创]解决mysql4.1的中文乱码问题

数据库为utf8编码,存中文信息若干。乱码出现在Linux机器上。windows上面没有这个问题。修改database.php,的function database,增加如下三行。

$q = "SET NAMES 'utf8' ";
$this->setQuery($q);
this->Query($q);

如果你是gb的,请改utf8位gb2312.
改后的function

        function database( $host='localhost', $user, $pass, $db, $table_prefix ) {
                // perform a number of fatality checks, then die gracefully
                if (!function_exists( 'mysql_connect' )) {
                        //or die( 'FATAL ERROR: MySQL support not available.  Please check your configuration.' );
                        $mosSystemError = 1;
                        $basePath = dirname( __FILE__ );
                        include $basePath . '/../configuration.php';
                        include $basePath . '/../offline.php';
                        exit();
                }
                if (!($this->_resource = @mysql_connect( $host, $user, $pass ))) {
                        //or die( 'FATAL ERROR: Connection to database server failed.' );
                        $mosSystemError = 2;
                        $basePath = dirname( __FILE__ );
                        include $basePath . '/../configuration.php';
                        include $basePath . '/../offline.php';
                        exit();
                }
                if (!mysql_select_db($db)) {
                        //or die( "FATAL ERROR: Database not found. Operation failed with error: ".mysql_error());
                        $mosSystemError = 3;
                        $basePath = dirname( __FILE__ );
                        include $basePath . '/../configuration.php';
                        include $basePath . '/../offline.php';
                        exit();
                }
                $this->_table_prefix = $table_prefix;
                $this->_ticker = 0;
                $this->_log = array();
                $q = "SET NAMES 'utf8' ";
                $this->setQuery($q);
                $this->Query($q);
        }



 

0 0
原创粉丝点击