免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1413 | 回复: 0
打印 上一主题 下一主题

mysql中的字符集问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-06 11:48 |只看该作者 |倒序浏览

               

   
        
            
            
            好多次更换
mysql
主机商时,都要造成
mysql
数据的乱码,因为网站开发历史经历了多个
mysql
版本,而且是在我刚刚学php时一点点做的,因为底层的东西很混乱,当时就没有也不知道如何处理字符串,今天决定好好的研究下它。
            
            mysql5提供了以下几个设置字符集的系统变量:
            
            character_set_client 客户端字符集
            character_set_connection 客户端与服务器端连接采用的字符集
            character_set_results SELECT查询返回数据的字符集
            character_set_database 数据库采用的字符集
            
            乱码问题一般是由于以上几个变量设置错误照成的,所以只要理解这几个变量,就可以与告别乱码了。
            
            使用上述变量,要理解这个核心思想: character_set_client,character_set_connection这两个变量保证要与 character_set_database编码的一致,而 character_set_results则保证与SELECT返回的结果与程序的编码一致。
            
            我们可以在程序中使用 set names来同时设置character_set_client, character_set_connection, character_set_results这三个系统变量。
            
            
            
            例如 set names 'utf8' 等同于 :
            
            set @@character_set_client = 'utf8'
            
            set @@character_set_connection = 'utf8'
            set @@character_set_results = 'utf8'
            
            一般情况下,当数据库与数据库表的字符集为utf8,我们再在程序里设置set names 'utf8'命令,这样就能保证无乱码了,但是,这里还要注意character_set_results变量的值,character_set_results的字符值是用来显示返回给用户的编码的。
            
            例
如,你的数据库(character_set_database)用的是utf8的字符集,那么你就要保证
character_set_client,character_set_connection也是utf8的字符集。而你的程序也许采用的并不是
utf8,比如你的程序用的是gbk,那么你若把character_set_results也设置为utf8的话就会出现乱码问题。此时你应该把
character_set_results设置为gbk。这样就能保证数据库返回的结果与你的程序的编码一致。
            以下摘自网络的一程序段:
            
            
            //假设我们的程序采用的是utf8的字符集
            $program_char = 'utf8';
            //先检查
mysql
的版本号,如果版本号大于4我们才可以设置这些系统变量(mysql4还没有这些系统变量)
            $version = current($db->fetch_one('SELECT VERSION()'));
            if (substr($version, 0, 1) > 4)
            {
            //取出当前数据库的字符集
            $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 . '"');
            }
            ?>
            
            
            1、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;
            2、要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致;
            3、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;
            4、要保证程序编码与浏览器编码一致,即程序编码与一致。
            
                               
               
               
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/34628/showart_1362169.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP