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
による実質的なデバッグが可能になります マクロ。これは、コードがこのブロックをどのように通過しているかを確認するのに役立つ場合があります。