SET NAMESの呼び出し 接続でset_charsetを呼び出すのと同じです 、どちらのget_charsetも呼び出さない場合 また、mysql_real_escape_string (および友達)。
set_charsetを呼び出すとき 、PHPは2つのことを行います。まず、SET NAMESを呼び出します 接続に。次に、設定した文字セットを記憶しています。その状態情報は、後でget_charsetでのみ使用されます およびmysql_real_escape_string (そして友達)機能。したがって、これらの関数を使用しない場合は、2つの同等の機能を検討することができます。
ソースを見てみましょう:
- ユーザーランド関数
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を呼び出すことができます 接続自体に悪影響はありません。
余談ですが、私はこれを行ったことがありませんが、-DPHP_DEBUG=1を使用してPHPをコンパイルしているようです。 さまざまなDBGによる実質的なデバッグが可能になります マクロ。これは、コードがこのブロックをどのように通過しているかを確認するのに役立つ場合があります。