Mysql
 sql >> Database >  >> RDS >> Mysql

set names vs mysqli_set_charset — oltre a influenzare mysqli_escape_string, sono identici?

Chiamata a SET NAMES sulla connessione equivale a chiamare set_charset , a condizione che non chiami né get_charsetmysql_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:

  1. Funzioni Userland mysql_set_charset e mysqli_set_charset chiama...
  2. Funzione motore mysql_set_character_set chiama...
  3. 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...

  4. 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_charsetmysql_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.