Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

成功的解决MYSQL的乱码问题!

[复制链接]
davelu 发表于 2006-9-11 15:47:33 | 显示全部楼层 |阅读模式
这几天在升级论坛,数据库乱码的问题最常见,尤其是从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<test.sql

然后你就能在phpmyadmin中见到阔别已久的中文了,而不再是讨厌的???????? 了。

[ 本帖最后由 davelu 于 2006-9-11 17:42 编辑 ]

评分

1

查看全部评分

 楼主| davelu 发表于 2006-9-11 18:11:38 | 显示全部楼层
同理,如果原来是用laint1建立的,只要备份出来的时候:

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

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

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

[ 本帖最后由 davelu 于 2006-9-11 18:16 编辑 ]
回复

使用道具 举报

linsie 发表于 2006-9-12 07:31:10 | 显示全部楼层
恩 很好 支持下。。。这个对很多人有用
回复

使用道具 举报

pc77maikongjian 发表于 2006-9-12 15:07:42 | 显示全部楼层
支持,分享
回复

使用道具 举报

Spider_C++ 发表于 2006-9-12 20:15:33 | 显示全部楼层
谢谢风箱
回复

使用道具 举报

 楼主| davelu 发表于 2006-9-13 15:35:55 | 显示全部楼层
继续这个话题。

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

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

最后在那段程序的:
  1. mysql_select_db($db_name, $this->link)
复制代码


前面加上:
  1. $this->query("SET NAMES 'utf8'");
复制代码


就基本正确了。

只有一个页面出现了:
  1. Server Error: (1406) Data too long for column 'eventDesc' at row 1
复制代码


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

由于是
  1. CREATE TEMPORARY TABLE hlstats_EventHistory
复制代码


也就是在建立临时数据库时,产生的问题,而且来源又自其它的数据库
  1. insertEvents("TeamBonuses", "
  2.                 SELECT
  3.                         '队伍奖励',
  4.                         <table>.eventTime,
  5.                         CONCAT('其战队受到点 ', bonus, '分奖励,原因 "', hlstats_Actions.description, '"'),
  6.                         hlstats_Servers.name,
  7.                         <table>.map
  8.                 FROM
  9.                         <table>
  10.                 LEFT JOIN hlstats_Actions ON
  11.                         <table>.actionId = hlstats_Actions.id
  12.                 LEFT JOIN hlstats_Servers ON
  13.                         hlstats_Servers.serverId = <table>.serverId
  14.                 WHERE
  15.                         <table>.playerId=$player
  16.         ");
复制代码


比较复杂,正在继续排查中。。。

评分

1

查看全部评分

回复

使用道具 举报

 楼主| davelu 发表于 2006-9-13 15:47:32 | 显示全部楼层
在MYSQL中运行的结果是:

队伍奖励 2006-08-30 00:36:47 其战队受到点 2分奖励,原因 "&#761;&#1232;???&#52347;&#1019;&eth;" 量子1#正版 www.shait.net de_dust2

看来还是有乱码出现,导致程序错误。

[ 本帖最后由 davelu 于 2006-9-13 15:48 编辑 ]
回复

使用道具 举报

 楼主| davelu 发表于 2006-9-14 09:34:31 | 显示全部楼层
判断出问题出在CONCAT这个MYSQL的函数里,并不是eventDesc的字段不够长。
如果把

  1. insertEvents("TeamBonuses", "
  2.                 SELECT
  3.                         '队伍奖励',
  4.                         <table>.eventTime,
  5.                         CONCAT('其战队受到点 ', bonus, '分奖励,原因 "', hlstats_Actions.description, '"'),
  6.                         hlstats_Servers.name,
  7.                         <table>.map
  8.                 FROM
  9.                         <table>
  10.                 LEFT JOIN hlstats_Actions ON
  11.                         <table>.actionId = hlstats_Actions.id
  12.                 LEFT JOIN hlstats_Servers ON
  13.                         hlstats_Servers.serverId = <table>.serverId
  14.                 WHERE
  15.                         <table>.playerId=$player
  16.         ");
复制代码

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

为了解决这个问题,最后是用ASCII(CHAR(bonus))来解决了,实在是晕。。。
回复

使用道具 举报

 楼主| davelu 发表于 2006-9-16 16:16:41 | 显示全部楼层
在那个汉化的程序里,用的是PERL语言:


  1. my $query = "
  2.   SELECT
  3.    playerId
  4.   FROM
  5.    hlstats_PlayerUniqueIds
  6.   WHERE
  7.    uniqueId='" . &::quoteSQL($uniqueId) . "' AND
  8.    game='" . $g_servers{$s_addr}->{game} . "'
  9. ";
  10. my $result = &doQuery($query);
复制代码


查找:

  1. my $result = &doQuery($query);
复制代码


在它上面加一条:

  1. my $result = &doQuery("SET NAMES 'utf8'");
复制代码


这就是PERL的MYSQL调用方式,解决问题。
回复

使用道具 举报

Clwarm 发表于 2006-9-17 19:14:01 | 显示全部楼层
支持一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-18 03:20 , Processed in 0.034620 second(s), 7 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表