कॉलिंग SET NAMES
कनेक्शन पर कॉल करने के बराबर है set_charset
, बशर्ते आप न तो कॉल करें get_charset
न ही mysql_real_escape_string
(और दोस्त)।
जब आप set_charset
. पर कॉल करते हैं , PHP दो काम करता है। सबसे पहले, यह SET NAMES
. को कॉल करता है कनेक्शन पर। दूसरा, यह याद रखता है कि आपने कौन सा चारसेट सेट किया है। उस राज्य की जानकारी का उपयोग बाद में केवल get_charset
. में किया जाता है और mysql_real_escape_string
(और दोस्त) कार्य करता है। इसलिए, यदि आप इन कार्यों का उपयोग नहीं करते हैं, तो आप दो समकक्षों पर विचार कर सकते हैं।
आइए चलते हैं स्रोत:
- उपयोगकर्ता भूमि कार्य करता है
mysql_set_charset
औरmysqli_set_charset
कॉल करें... - इंजन फ़ंक्शन
mysql_set_character_set
कॉल... -
इंजन मैक्रो
mysqlnd_set_character_set
, जिसे इस प्रकार परिभाषित किया गया है:#define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))
और विस्तार करता है...
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)
जिसमें शामिल निम्नलिखित कोड (चर्चा के लिए क्रमांकित, ये वास्तविक स्रोत पंक्ति संख्या नहीं हैं):
1 if (PASS == conn->m->local_tx_start(conn, this_func)) {
2 char * query;
3 size_t query_len = mnd_sprintf(&query, 0, "SET NAMES %s", csname);
4
5 if (FAIL == (ret = conn->m->query(conn, query, query_len))) {
6 php_error_docref(NULL, E_WARNING, "Error executing query");
7 } else if (conn->error_info->error_no) {
8 ret = FAIL;
9 } else {
10 conn->charset = charset;
11 }
12 mnd_sprintf_free(query);
13
14 conn->m->local_tx_end(conn, this_func, ret);
15 }
जैसा कि आप देख सकते हैं, PHP SET NAMES
. को कॉल करता है कनेक्शन पर ही (पंक्ति 3)। PHP अभी सेट किए गए वर्णसेट को भी ट्रैक करता है (पंक्ति 10)। टिप्पणियाँ आगे चर्चा करती हैं कि conn->charset
. के साथ क्या होता है , लेकिन यह कहने के लिए पर्याप्त है कि यह केवल get_charset
. में होता है और mysql_real_escape_string
(और दोस्त)।
इसलिए, यदि आप इस स्थिति की परवाह नहीं करते हैं, और आप न तो get_charset
का उपयोग करने के लिए सहमत हैं न ही mysql_real_escape_string
, तो आप SET NAMES
. पर कॉल कर सकते हैं कनेक्शन पर ही बिना किसी दुष्प्रभाव के।
एक तरफ के रूप में, और मैंने ऐसा कभी नहीं किया है, लेकिन ऐसा लगता है कि PHP को -DPHP_DEBUG=1
के साथ संकलित किया जा रहा है विभिन्न DBG
. के माध्यम से पर्याप्त डिबगिंग सक्षम करेगा मैक्रोज़ यह देखने में उपयोगी हो सकता है कि आपका कोड इस ब्लॉक से कैसे गुजर रहा है।