在连接上调用SET NAMES
相当于 call set_charset
,前提是你既不打电话get_charset
也不mysql_real_escape_string
(和朋友)。
当您调用 时set_charset
,PHP 会做两件事。首先,它调用SET NAMES
连接。其次,它会记住您设置的字符集。该状态信息稍后仅用于get_charset
and 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
nor mysql_real_escape_string
,那么您可以调用SET NAMES
连接本身而不会产生不良影响。
顺便说一句,我从来没有这样做过,但看起来编译 PHP-DPHP_DEBUG=1
可以通过各种DBG
宏进行大量调试。这对于查看您的代码如何通过此块可能很有用。