• 技术文章 >后端开发 >php教程

    深入理解SET NAMES和mysql(i)_set_charset的区别

    2016-06-01 14:24:24原创580

    今天看到大家在讨论,发现这是个很严重而又容易疏忽的问题,我以前也一直是用set names,遂记录下来,也提醒自己一把。

    set names与mysql_set_charset有什么区别?

    一般情况下, 使用”SET NAMES”就足够了, 也是可以保证正确的. 那么为什么手册又要说推荐使用 mysqli_set_charset(PHP>=5.0.5)呢。手册里面也没有明确说明。

    首先, 很多人都不知道”SET NAMES”到底是做了什么,

    我之前的文章《深入理解MySQL字符集设置》中, 曾经介绍过character_set_client/character_set_connection/character_set_results这三个MySQL的”环境变量”, 这里再简单介绍下,

    这三个变量, 分别告诉MySQL服务器, 客户端的编码集, 在传输给MySQL服务器的时候的编码集, 以及期望MySQL返回的结果的编码集.

    比如, 通过使用”SET NAMES utf8″, 就告诉服务器, 我用的是utf-8编码, 我希望你也给我返回utf-8编码的查询结果.

    一般情况下, 使用”SET NAMES”就足够了, 也是可以保证正确的. 那么为什么手册又要说推荐使用mysqli_set_charset(PHP>=5.0.5)呢?

    首先, 我们看看mysqli_set_charset到底做了什么(注意星号注释处, mysql_set_charset类似):

    //php-5.2.11-SRC/ext/mysqli/mysqli_nonapi.c line 342
    PHP_FUNCTION(mysqli_set_charset)
    {
        MY_MYSQL            *mysql;
        zval                *mysql_link;
        char                *cs_name = NULL;
        unsigned int        len;
     
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis()
              , "Os", &mysql_link, mysqli_link_class_entry, &cs_name, &len) == FAILURE) {
            return;
        }
        MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL*, &mysql_link, "mysqli_link"
            , MYSQLI_STATUS_VALID);
     
        if (mysql_set_character_set(mysql->mysql, cs_name)) {
              //** 调用libmysql的对应函数
            RETURN_FALSE;
        }
        RETURN_TRUE;
    }

    1 2 下一页
    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:怎样利用好PATH_INFO方式隐藏index.php文件? 下一篇:PHP程序中Static方法效率的测试
    PHP编程就业班

    相关文章推荐

    • 一个个人网页自动化生成系统4_PHP教程• php自动跳转中英文页面_php技巧• php对文件夹进行相关操作(遍历、计算大小)_PHP• php中memcache 基本操作实例_PHP• PHP网页游戏学习之Xnova(ogame)源码解读(五)_PHP

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网