來源:互聯網
上載者: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 下一頁