mysql的字符集需要设置服务器和客户端两种方式,单独都可以设置。
客户端可以通过phpmyadmin等设置,服务端需要修改my.ini
my.ini在linux下是my.cnf
其中都有两处需要修改,默认字符集是liant1
找到[mysqld],
修改或增加以下行:
default_character_set=utf8
找到[mysql],
修改或增加以下行:
default_character_set=utf8
重启即可修改服务端字符集。
摘录高手文章,因未署名,在此感谢。
—————————————————————————————————————
乱码的问题首先是来自于mysql4.1对于编码支持的重大升级,我不是搞技术的,不懂为啥要改成多编码的支持,就知道这是为了能够全球兼容。在4.0及以前,php程序和mysql之间的沟通是通过latin1编码的,不管数据是什么编码按照这个编码写入、取出,东西就不会变。4.1之后,mysql给了用户选择,只要说清楚用什么语言和mysql交流,mysql都可以来者不拒了。这个时候,分歧发生了:
phpmyadmin是一款全球性的软件,它决定用全球兼容的utf-8和mysql沟通。但是,在mysql4.1之前的产品都是用latin1和mysql沟通的。那么,如果你通过phpmyadmin向mysql写入或者导入数据,你就用utf-8的编码把whatever的东西写入了数据库。如果你再用urf-8的编码读出来,不管是什么,就还原成之前的数据了。但是之前的php,都是用latin1和mysql沟通的,如果是通过phpmyadmin写入的数据,php程序就读不出来了;php写入的数据,phpmyadmin当然也认识不了。特别是现在大部分同学使用的都是虚机,phpmyadmin导入数据的做法必不可少,问题就随之而来了。
解决办法:(凑合法,完美主义者不适用)
既然之前问题定位在phpmyadmin和php程序之间鸡同鸭讲。那我们就有两种办法了,一种是php改口音,一种是phpmyadmin改口音。
php改口音适合大多数情况,方法也很简单,只要在php程序的mysql_connect语句之后,加上一句“SET NAMES ‘utf8′;”。这样,php就改成了phpmyadmin的口音,天下和谐了。
phpmyadmin改口音的情况不少,比如我现在用了一套toooooooold的加密php程序。而且处理出来的数据我还非要用phpmyadmin操作一下(累……)。找了一下办法,最快的办法就是给phpmyadmin打补丁。找到/libraries/select_lang.lib.php。找到”utf-8″ => “utf8″,把utf8改成latin1。这样你的phpmyadmin就可以读取出php写入的数据了,如果你不是写入的utf8的数据,那么你只要调整一下页面显示编码就可以了。
其实随便改一下phpmyadmin就可以改页面显示编码了.把
‘zh-utf-8′ => array(’zh|chinese simplified’, ‘chinese_simplified-utf-8′, ‘zh’, ‘中文’)
这一行,中-utf-8改成-gb2312。但是这样一改,就是要把”gb2312″ => “gb2312′要改成”gb2312″ => “latin1″了。然后立刻就奏效了。
我研究了一下phpmyadmin的说名,其实大可以在它的config文件里选择和数据库沟通的编码和页面显示的编码(这种方法适合完美主义者)。但是英文的杀伤力还是不小,不如程序容易读啊。
这种patch的方法倒是次要的,只要找到问题的症结,怎么改都可以了。但是这个经典的问题,却让我看到了全球化还是有不小的阵痛的。貌似每个php程序员都碰到过这种编码的经典问题。就是因为我们用的是各国人名共同创造的东西,之前创始者转制一点,谁造的听谁的,大家还可以勉强维持配合。社会进步了,基础的支撑者突然向世界开放之后,同一平台上运用标准的不统一成了巨大的阵痛。虽然以后不会再为了两个完全不同的汉字被mysql认为相等而头疼,但我至少花了5个小时在这个事情上,就算平均每个php开发者用1个小时,也是巨大的损失了。
——————————————————————————–
mysql_query(“set names utf8”);
mysql_query(“set names latin1”);