您的位置:首页 > 数据库 > MySQL

成功解决MYSQL的乱码问题!

2007-10-16 01:19 274 查看
原贴:http://faq.csdn.net/read/216877.html

问题内容:成功解决MYSQL的乱码问题!

原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=5013925

所属论坛:MySQL/Postgresql 审核组:其他数据库开发

提问者:Davelu 解决者:davelu

感谢:mathematician

关键字:数据库 其他数据库开发 MySQL/Postgresql 升级 乱码 备份 导入 字符集 mysql phpmyadmin 阔别 校对

答案:
这几天在升级论坛,数据库乱码的问题最常见,尤其是从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

在导入SQL数据库时,使用如下命令:
mysql -uroot -p --default-character-set=utf8 -f test<test.sql

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

---------------------------------------------------------------
补充:

上文中在
MYSQL连接校对: utf8_general_ci
的后面应该加一句:

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

-----------------------------------------------

同理,如果原来是用laint1建立的,只要备份出来的时候:

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

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

对于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

后来发现并不是字符超长了,而是由于MYSQL 5中的CONCAT函数的问题。

在CREATE TEMPORARY TABLE hlstats_EventHistory中
insertEvents("TeamBonuses", "
SELECT
'队伍奖励',
<table>.eventTime,
CONCAT('其战队受到点 ', bonus, '分奖励,原因 /"', hlstats_Actions.description, '/"'),
hlstats_Servers.name,
<table>.map
FROM
<table>
LEFT JOIN hlstats_Actions ON
<table>.actionId = hlstats_Actions.id
LEFT JOIN hlstats_Servers ON
hlstats_Servers.serverId = <table>.serverId
WHERE
<table>.playerId=$player
");
这里的bonus是一个int(11)的字段,和中文连接造成中文乱码。

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

评价:

给朵鲜花(93)

扔个鸡蛋(20)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: