深入理解SET NAMES和mysql(i)_set_charset的區別

來源:互聯網
上載者:User
關鍵字 深入理解SET NAMES和mysql(i)_set_charset的區別

今天看到大家在討論,發現這是個很嚴重而又容易疏忽的問題,我以前也一直是用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 342PHP_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 下一頁
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.