Chamando
SET NAMES
na conexão é equivalente a chamar set_charset
, desde que você não chame get_charset
nem mysql_real_escape_string
(e amigos). Quando você chama
set_charset
, o PHP faz duas coisas. Primeiro, ele chama SET NAMES
na conexão. Segundo, ele lembra qual charset você definiu. Essas informações de estado são usadas posteriormente apenas no get_charset
e mysql_real_escape_string
(e amigos) funções. Portanto, se você não usar essas funções, poderá considerar as duas equivalentes. Vamos percorrer a fonte:
- Funções do Userland
mysql_set_charset
emysqli_set_charset
ligue... - Função do mecanismo
mysql_set_character_set
chamadas... -
Macro do mecanismomysqlnd_set_character_set
, que é definido como:
#define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))
e se expande para...
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)
que contém o código a seguir (numerado para discussão, estes não são números de linha de origem reais):
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 }
Como você pode ver, o PHP chama
SET NAMES
na própria conexão (linha 3). O PHP também rastreia o conjunto de caracteres que acabou de ser definido (linha 10). Os comentários discutem ainda mais o que acontece com conn->charset
, mas basta dizer que acaba sendo apenas em get_charset
e mysql_real_escape_string
(e amigos). Portanto, se você não se importa com esse estado e concorda em usar nem
get_charset
nem mysql_real_escape_string
, então você pode chamar SET NAMES
na própria conexão sem nenhum efeito nocivo. Como um aparte, e eu nunca fiz isso, mas parece compilar PHP com
-DPHP_DEBUG=1
permitirá depuração substancial através de vários DBG
macros. Isso pode ser útil para ver como seu código está passando por esse bloco.