那么set names是什么呢? set names实际上就是同时设置了character_set_clientcharacter_set_connectioncharacter_set_results这三个系统变量 例如set names gbk等同于 set @@character_set_client = gbk set @@character_set_connection = gbk set @@character_set_results = gbk
很多情况下这样设置了之后就能把乱码问题解决了但是还是不能完全避免出现乱码的可能为什么呢? 因为character_set_clientcharacter_set_connection这两个变量仅用与保证与character_set_database编码的一致而character_set_results则用与保证SELECT返回的结果与程序的编码一致 例如你的数据库(character_set_database)用的是utf的字符集那么你就要保证character_set_clientcharacter_set_connection也是utf的字符集而你的程序也许采用的并不是utf比如你的程序用的是gbk那么你若把character_set_results也设置为utf的话就会出现乱码问题此时你应该把character_set_results设置为gbk这样就能保证数据库返回的结果与你的程序的编码一致 下面我给出一段用于设置字符集的代码(其中用到了一个我自己写的db库相信应该不影响阅读) <? //假设我们的程序采用的是utf的字符集 $program_char = utf; //先检查mysql的版本号如果版本号大于我们才可以设置这些系统变量(mysql还没有这些系统变量) $version = current($db>fetch_one(SELECT VERSION())); if (substr($version ) > ) { //取出当前数据库的字符集 $sql = SELECT @@character_set_database; $char = current($db>fetch_one($sql)); //将客户端字符集(character_set_client)和 连接字符集(character_set_connection)设置为与数据库字符集(character_set_database)一致 $db>query(SET @@character_set_client = $char ); $db>query(SET @@character_set_connection = $char ); //将SELECT查询返回数据的字符集设置为与当前程序的字符集一致 $db>query(SET @@character_set_results = $program_char ); } ?>
到此应该就可以解决绝大多数我们遇到的乱码问题了另外还必须强调的是有时候乱码的出现有可能是以上几种原因混合造成的 对于这样的问题处理起来就比较的麻烦因为首先要保证你在数据库中保存的数据的字符集与数据库的字符集是一致的如果你在一个utf的数据库中保存了GBK字符数据(如果你页面的编码与数据库的编码不一致那么产生这个问题的可能性就很大)那么假设以上的设置都正确结果还是会出现乱码的问题不过这类问题一旦确定了产生的原因那么就还是有办法解决的比如刚才我举的这个例子 我们如果能确保其他环节的设置都是正确的并且能够确认是由于把gbk的数据存到了utf的数据库中而造成的乱码那么我就可以把这些数据从数据库中取出来之后再用iconv()转换编码也是可以的 总而言之我们应当尽量的保证数据库中的数据是正确的那么问题处理起来就相对简单了 说了一大堆可能把你给弄迷糊了我将其总结为以下四点便于大家记忆 要保证数据库中存的数据与数据库编码一致即数据编码与character_set_database一致 要保证通讯的字符集与数据库的字符集一致即character_set_client character_set_connection与character_set_database一致 要保证SELECT的返回与程序的编码一致即character_set_results与程序编码一致 要保证程序编码与浏览器编码一致即程序编码与<meta httpequiv=ContentType content=text/html; charset=?/>一致 [] [] |