Mysql以utf8存储gbk输出的实现方法提供

 更新时间:2007年11月16日 13:42:29   作者:  
一个站有可能经历gb2312(gbk,big5)到utf8的转换过程,其中会遇到很多的问题。站点太庞大了怎么办呢,只能一步步来了。要是能在极少改动前端代码的情况下,先完成数据的转换将会使整件事情容易得多。经过几天测试终于发现,Mysql以utf8存储gbk输出是可以实现的。mysql4.1后都有个特性,可以指定当前客户端连接所使用的字符集,mysql默认都是latin1,或由mysql server端配置的字符集进行连接校对。我使用utf8_general_ci来创建字段。 
DB:
SQL代码:
复制代码 代码如下:

Create TABLE `table` (  
`id` INT( 10 ) NOT NULL ,  
`name` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,  
INDEX ( `g_id` )   
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;  


PHP:
存储操作指定使用utf8字符集进行连接校对,读取操作指定使用gbk字符集进行连接校对。


PHP代码:
复制代码 代码如下:

<?php  
        //    Select    DB    And    Set    Link    Use    UTF8  
        function    _select_db_utf()  
        {  
        mysql_select_db($this->db_name,    $this->db_link);  


        //    init    character  
        mysql_query("SET    NAMES    utf8",    $this->db_link);  
        mysql_query("SET    CHARACTER    SET    utf8",    $this->db_link);  
        mysql_query("SET    COLLATION_CONNECTION='utf8_general_ci'",    $this->db_link);  


        return    true;  
        }  


        //    Select    DB    And    Set    Link    Use    GBK  
        function    _select_db_gb()  
        {  
        mysql_select_db($this->db_name,    $this->db_link);  


        //    init    character  
        mysql_query("SET    NAMES    gbk",    $this->db_link);  
        mysql_query("SET    CHARACTER    SET    gbk",    $this->db_link);  
        mysql_query("SET    COLLATION_CONNECTION='gbk_chinese_ci'",    $this->db_link);  


        return    true;  
        }  
?>  
需要注意几点:
1. mysql必须把gbk,gb2312,utf8等字符集编译进去。
2. 入库的数据内容必须保证是最正确的UTF8编码。
3. 存储和读取操作要指定正确的字符集进行连接校对。

要是前端代码操作数据入库不能以UTF8进行,则需要对字符进行转码了。(例如用AJAX提交的数据便是正确的UTF8,这时是不用转换的。)

因为mb_string是PHP所支持字符最全的,而iconv比它稍差一点,mb_string并不能完全支持一些特殊字符的转码,所以目前为止都没有完美的转码方法。

再次对mb_string和iconv进行比较:

mb_string:
1. 所支持字符最全
2. 内容自动识别编码,不需要确定原来字符的编码,但是执行效率比iconv差太多
3. $content = mb_convert_encoding($content, "UTF-8", "GBK,GB2312,BIG5");(顺序不同效果也有差异)

iconv:
1. 所支持字符不全
2. 需要确定原来字符的编码,但在确定编码的情况下执行效率比mb_convert_encoding高
3. $content = iconv("GBK", "UTF-8", $content);

相关文章

  • 深入研究mysql中的varchar和limit(容易被忽略的知识)

    深入研究mysql中的varchar和limit(容易被忽略的知识)

    这篇文章主要介绍了深入研究mysql中的varchar和limit(容易被忽略的知识),本文探究了varchar(5)可以存储多少个汉字、多少个字母数字和mysql中的limit你真的会用吗两个知识点,需要的朋友可以参考下
    2015-03-03
  • linux/mac安装mysql忘记密码的解决办法

    linux/mac安装mysql忘记密码的解决办法

    这篇文章主要给大家介绍了关于linux/mac安装mysql忘记密码的解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • MySQL错误代码大全

    MySQL错误代码大全

    本章列出了当你用任何主机语言调用MySQL时可能出现的错误。首先列出了服务器错误消息。其次列出了客户端程序消息
    2014-01-01
  • MySQL8.0.26的安装与简化教程(全网最全)

    MySQL8.0.26的安装与简化教程(全网最全)

    MySQL关是一种关系数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用的标准化语言,今天通过本文给大家分享MySQL8.0.26的安装与简化教程使全网最详细的安装教程,需要的朋友参考下吧
    2021-07-07
  • Mysql索引创建删除及使用代价

    Mysql索引创建删除及使用代价

    这篇文章主要为大家介绍了Mysql索引创建删除及使用代价详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • MySQL thread_stack连接线程的优化

    MySQL thread_stack连接线程的优化

    当有新的连接请求时,MySQL首先会检查Thread Cache中是否存在空闲连接线程,如果存在则取出来直接使用,如果没有空闲连接线程,才创建新的连接线程
    2017-04-04
  • Express连接MySQL及数据库连接池技术实例

    Express连接MySQL及数据库连接池技术实例

    数据库连接池是程序启动时建立足够数量的数据库连接对象,并将这些连接对象组成一个池,由程序动态地对池中的连接对象进行申请、使用和释放,本文重点给大家介绍Express连接MySQL及数据库连接池技术,感兴趣的朋友一起看看吧
    2022-02-02
  • Python MySQL进行数据库表变更和查询

    Python MySQL进行数据库表变更和查询

    这篇文章主要介绍了Python MySQL进行数据库表变更和查询的相关资料,需要的朋友可以参考下
    2017-05-05
  • MySQL 最基本的SQL语法/语句

    MySQL 最基本的SQL语法/语句

    MySQL 最基本的SQL语法/语句,使用mysql的朋友可以参考下。
    2011-09-09
  • mysql中整数数据类型tinyint详解

    mysql中整数数据类型tinyint详解

    大家好,本篇文章主要讲的是mysql中整数数据类型tinyint详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论