Chiamata a SET NAMES
sulla connessione equivale a chiamare set_charset
, a condizione che non chiami né get_charset
né mysql_real_escape_string
(e amici).
Quando chiami set_charset
, PHP fa due cose. Innanzitutto, chiama SET NAMES
sulla connessione. In secondo luogo, ricorda quale set di caratteri hai impostato. Quelle informazioni sullo stato vengono successivamente utilizzate solo nel get_charset
e mysql_real_escape_string
(e amici) funzioni. Pertanto, se non utilizzi queste funzioni, puoi considerare le due equivalenti.
Passiamo alla fonte:
- Funzioni Userland
mysql_set_charset
emysqli_set_charset
chiama... - Funzione motore
mysql_set_character_set
chiama... -
Macro motore
mysqlnd_set_character_set
, che è definito come:#define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))
e si espande a...
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)
che contiene il codice seguente (numerato per la discussione, questi non sono numeri di riga di origine effettivi):
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 }
Come puoi vedere, PHP chiama SET NAMES
sulla connessione stessa (linea 3). PHP tiene traccia anche del set di caratteri appena impostato (riga 10). I commenti discutono ulteriormente cosa succede con conn->charset
, ma basti dire che finisce per essere solo in get_charset
e mysql_real_escape_string
(e amici).
Quindi, se non ti interessa questo stato e accetti di non utilizzare né get_charset
né mysql_real_escape_string
, quindi puoi chiamare SET NAMES
sulla connessione stessa senza alcun effetto negativo.
Per inciso, e non l'ho mai fatto, ma sembra compilare PHP con -DPHP_DEBUG=1
consentirà un debug sostanziale attraverso vari DBG
macro. Potrebbe essere utile per vedere come il tuo codice passa attraverso questo blocco.