Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3178577
  • 博文数量: 797
  • 博客积分: 10134
  • 博客等级: 上将
  • 技术积分: 9335
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-22 22:57
个人简介

1

文章分类

全部博文(797)

文章存档

2022年(1)

2021年(2)

2017年(2)

2016年(1)

2015年(4)

2014年(1)

2013年(6)

2012年(6)

2011年(10)

2010年(26)

2009年(63)

2008年(61)

2007年(51)

2006年(563)

我的朋友

分类:

2006-10-10 10:03:14



这几天在升级论坛,数据库乱码的问题最常见,尤其是从MYSQL 4.0升到MYSQL 5。
我在升级的时候也碰到这个问题,经过无数次的测试,终于解决了这个问题。

使用的是GBK,在备份原数据库时,使用:

mysqldump -uroot -p --default-character-set=gbk --skip-opt test >test.sql

在phpmyadmin中建立新的数据库,在phpmyadmin中设置:

language: chinese simplified (zh-utf-8)
MYSQL字符集: UTF-8 Unicode (utf8)
MYSQL连接校对: utf8_general_ci

建立的时候在phpmyadmin中用:
CREATE DATABASE `test` DEFAULT CHARACTER SET gbk;

在导入SQL数据库时,使用如下命令:
mysql -uroot -p --default-character-set=utf8 -f test
然后你就能在phpmyadmin中见到阔别已久的中文了,而不再是讨厌的???????? 了。
 
同理,如果原来是用laint1建立的,只要备份出来的时候:

mysqldump -uroot -p --default-character-set=laint1 --skip-opt test >test.sql

其它步骤相同,这样就转为了GBK,以后也都统一使用相同的编码了。

对于MYSQL不熟的朋友,对于MYSQL不熟的朋友,希望能用这帖让你有所借鉴。
同理,如果原来是用laint1建立的,只要备份出来的时候:

mysqldump -uroot -p --default-character-set=laint1 --skip-opt test >test.sql

其它步骤相同,这样就转为了GBK,以后也都统一使用相同的编码了。

对于MYSQL不熟的朋友,对于MYSQL不熟的朋友,希望能用这帖让你有所借鉴。
继续这个话题。

原来我有一段程序是汉化国外的。在MYSQL4里面,如果用phpmyadmin中看是乱码,但在客户端调用出来是中文。
这说明只要你写入是一种编码,调用是同样的,数据库里是乱码没关系。
后来在升级DZ5时,我把数据库也升到MYSQL5,这时就想把原来laint1转成gbk了。
按上述的方法转完,那个汉化程序里出来的却是乱码。

由于只是涉及数据库时出现乱码,所以肯定是MYSQL的问题。

最后在那段程序的:

mysql_select_db($db_name, $this->link)

前面加上:

$this->query("SET NAMES 'utf8'");

就基本正确了。

只有一个页面出现了:

Server Error: (1406) Data too long for column 'eventDesc' at row 1

的错误,查了一下,还是字符集的问题。

由于是

CREATE TEMPORARY TABLE hlstats_EventHistory

也就是在建立临时数据库时,产生的问题,而且来源又自其它的数据库

insertEvents("TeamBonuses", "
                SELECT
                        '队伍奖励',
                        .eventTime,
                        CONCAT('其战队受到点 ', bonus, '分奖励,原因 \"', hlstats_Actions.description, '\"'),
                        hlstats_Servers.name,
                       
.map
                FROM
                       

                LEFT JOIN hlstats_Actions ON
                       
.actionId = hlstats_Actions.id
                LEFT JOIN hlstats_Servers ON
                        hlstats_Servers.serverId =
.serverId
                WHERE
                       
.playerId=$player
        ");
比较复杂,正在继续排查中。。。
 
在MYSQL中运行的结果是:

队伍奖励 2006-08-30 00:36:47 其战队受到点 2分奖励,原因 "˹Ӑ???챻ϻð" 量子1#正版 de_dust2

看来还是有乱码出现,导致程序错误。
 
判断出问题出在CONCAT这个MYSQL的函数里,并不是eventDesc的字段不够长。
如果把

insertEvents("TeamBonuses", "
                SELECT
                        '队伍奖励',
                        
.eventTime,
                        CONCAT('其战队受到点 ', bonus, '分奖励,原因 \"', hlstats_Actions.description, '\"'),
                        hlstats_Servers.name,
                        
.map
                FROM
                        

                LEFT JOIN hlstats_Actions ON
                        
.actionId = hlstats_Actions.id
                LEFT JOIN hlstats_Servers ON
                        hlstats_Servers.serverId =
.serverId
                WHERE
                        
.playerId=$player
        ");
中的CONCAT('其战队受到点 ', bonus, '分奖励,原因 \"', hlstats_Actions.description, '\"'),
替换成 CONCAT('其战队受到点 ', 2, '分奖励,原因 \"', hlstats_Actions.description, '\"'),
结果就为
队伍奖励 2006-08-30 00:36:47 其战队受到点 2分奖励,原因 "所有警察被消灭" 量子1#正版 de_dust2
看来问题出在CONCAT里,这个bonus是个int(11)数字,与中文结合起来就出错了。
这里的bonus是一个int(11)的字段,和中文连接造成中文乱码。

为了解决这个问题,最后是用ASCII(CHAR(bonus))来解决了,实在是晕。。。
 
在那个汉化的程序里,用的是PERL语言:

my $query = "
  SELECT
   playerId
  FROM
   hlstats_PlayerUniqueIds
  WHERE
   uniqueId='" . &::quoteSQL($uniqueId) . "' AND
   game='" . $g_servers{$s_addr}->{game} . "'
";
my $result = &doQuery($query);

查找:

my $result = &doQuery($query);

在它上面加一条:

my $result = &doQuery("SET NAMES 'utf8'");

这就是PERL的MYSQL调用方式,解决问题。
 
 
阅读(2248) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~