Calling SET NAMES
连接上相当于调用set_charset
,前提是您既不打电话也不打电话get_charset
nor mysql_real_escape_string
(和朋友)。
你打电话时set_charset
,PHP 做了两件事。首先,它调用SET NAMES
在连接上。其次,它会记住您设置的字符集。该状态信息稍后仅在get_charset
and mysql_real_escape_string
(和朋友)功能。因此,如果您不使用这些函数,那么您可以考虑将两者等效。
我们来看看源码:
- 用户层函数
mysql_set_charset
and mysqli_set_charset
call...
- 发动机功能
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)
which contains以下代码(编号用于讨论,这些不是实际的源代码行号):
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
and mysql_real_escape_string
(和朋友)。
所以,如果你不关心这个状态,并且你同意不使用get_charset
nor mysql_real_escape_string
,那么你可以打电话SET NAMES
对连接本身没有不良影响。
顺便说一句,我从来没有这样做过,但它看起来像用-DPHP_DEBUG=1
将通过各种方式进行大量调试DBG
宏。这对于查看代码如何通过此块可能很有用。