Ringer til SET NAMES
på forbindelsen svarer til at kalde set_charset
, forudsat at du hverken kalder get_charset
heller ikke mysql_real_escape_string
(og venner).
Når du kalder set_charset
, PHP gør to ting. Først kalder den SET NAMES
på forbindelsen. For det andet husker den, hvilket tegnsæt du har angivet. Denne tilstandsinformation bruges senere kun i get_charset
og mysql_real_escape_string
(og venner) funktioner. Derfor, hvis du ikke bruger disse funktioner, kan du overveje de to tilsvarende.
Lad os gå kilden:
- Brugerlandsfunktioner
mysql_set_charset
ogmysqli_set_charset
ring... - Motorfunktion
mysql_set_character_set
opkald... -
Motormakro
mysqlnd_set_character_set
, som er defineret som:#define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))
og udvides til...
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)
som indeholder følgende kode (nummereret til diskussion, disse er ikke faktiske kildelinjenumre):
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 }
Som du kan se, kalder PHP SET NAMES
på selve forbindelsen (linje 3). PHP sporer også det netop indstillede tegnsæt (linje 10). Kommentarerne diskuterer yderligere, hvad der sker med conn->charset
, men det er nok at sige, at det kun ender i get_charset
og mysql_real_escape_string
(og venner).
Så hvis du er ligeglad med denne tilstand, og du accepterer hverken at bruge get_charset
heller ikke mysql_real_escape_string
, så kan du kalde SET NAMES
på selve forbindelsen uden dårlig effekt.
Som en sidebemærkning, og jeg har aldrig gjort dette, men det ligner at kompilere PHP med -DPHP_DEBUG=1
vil muliggøre væsentlig debugging gennem forskellige DBG
makroer. Det kan være nyttigt for at se, hvordan din kode passerer gennem denne blok.