免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1065 | 回复: 0
打印 上一主题 下一主题

MySQL 4.1 与 Discuz 编码设置的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-21 19:34 |只看该作者 |倒序浏览

                搬移虚拟主机的过程中,在 MySQL 4.1.12 上出了严重的编码问题,导致所有中
文数据在数据库中均不正常。直到今天重新设定数据库的编码,然后在
Discuz(大概是 2.5 版)中加入一行代码,才得以正常显示。
论坛的数据导出成 SQL 了,在 phpMyAdmin 里导入到数据库。有点麻烦的是,整
个 SQL 有接近 1.5M,一次执行有问题,于是分成若干份一个一个导入。导入完
成后,各个表的条数是对的。但进论坛一看,却全是乱码,英文字母还正常,汉
字就全显示成问号了。试着在 Discuz 里输入中文,在 Discuz 显示正常,但在
数据库里却显示成四个拉丁形式的字符。
上网查资料,又下载新版的 phpMyAdmin 2.9.0.2,再试了都不行。
(phpMyAdmin 在执行某些 SQL 的时候有 bug)在老兵团里讨论过后,总算知道
大概可行的办法就是在创建表的时候指定字符集。今天把所有的表都删了,然后
在 SQL 里的每条 CREATE TABLE 后面都加上字符集的指定:DEFAULT CHARACTER
SET utf8 COLLATE utf8_general_ci,这样创建的表都是用 utf-8 表示的了。
再次导入所有数据后,在 phpMyAdmin 里显示的汉字终于正常了。但是在
Discuz 里显示的还是问号。崩溃。不得以,重新删除所有表,再设置字符集为
gbk 以及 gbk_chinese_ci,然而 Discuz 还是不能正常显示。
(注:可用 SHOW CHARACTER SET; 查看 MySQL 支持的字符集。MySQL 除了字符
集,还有一种 collation。collation 用于字符串的比较。)
中间又做了一些修改,如
ALTER DATABASE forum DEFAULT CHARACTER SET gbk
DEFAULT COLLATE gbk_chinese_ci;
来修改数据库的特性。然而还是没有效果。但是此时的问题显然更可以出在
Discuz 那端,因为在 phpMyAdmin 里,数据一切正常。
在 Discuz 的源代码里查找有关 charset 的代码,结果没有发现有用的。不过在
网上查到说是在 /include/db_mysql.php 里修改的,但我对照源代码却没有发现。
在试了 config.php 里那个强制编码的变量后,也没有效果。
无赖之下,下载了一个 Discuz 4.1,上传上去根本对不上号,数据库结构完全不
对。不过耍了个小聪明,想是否可以用 Discuz 4.1 的文件替换掉一小部分呢?
于是比较新旧的 db_mysql.php(4.1 里是 db_mysql.class.php)的内容,发现
4.1 版的在连接数据库的时候,针对 MySQL 4.1 以上的版本多了一个 SET
NAMES 语句的调用。正好这个 SET NAMES 是设置有关字符集的命令。于是
把这句修改一下,在旧文件对应位置加入 mysql_query("SET NAMES 'gbk'");。
上传之后,发现一切正常了!哭啊!
与 SET NAMES 相关的内容可在 MySQL 5.1 的中文在线帮助里看到,
http://dev.mysql.com/doc/refman/5.1/zh/charset.html。主要是这个命令是
一次性的,所以要在连接之后马上调用。
    function connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect = 0) {
        if($pconnect) {
            if(!@mysql_pconnect($dbhost, $dbuser, $dbpw)) {
                $this->halt('Can not connect to MySQL server');
            }
        } else {
            if(!@mysql_connect($dbhost, $dbuser, $dbpw)) {
                $this->halt('Can not connect to MySQL server');
            }
        }
        
        mysql_query("SET NAMES 'gbk'");   # <=== 这里加入
        mysql_select_db($dbname);
    }
终于可以灌水了。
主要是 MySQL 默认是 UTF-8 编码,但却有部分设置为 latin1,结果默认的不正
常。Discuz 也太老,不支持设定字符集。

               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/24581/showart_188540.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP