Ringer SET NAMES
på anslutningen motsvarar att anropa set_charset
, förutsatt att du inte anropar get_charset
inte heller mysql_real_escape_string
(och vänner).
När du anropar set_charset
, PHP gör två saker. Först anropar den SET NAMES
på anslutningen. För det andra kommer den ihåg vilken teckenuppsättning du ställt in. Den tillståndsinformationen används senare endast i get_charset
och mysql_real_escape_string
(och vänner) funktioner. Därför, om du inte använder dessa funktioner, kan du överväga de två motsvarigheten.
Låt oss gå källan:
- Användarlandsfunktioner
mysql_set_charset
ochmysqli_set_charset
ring... - Motorfunktion
mysql_set_character_set
samtal... -
Motormakro
mysqlnd_set_character_set
, som definieras som:#define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))
och expanderar till...
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)
som innehåller följande kod (numrerad för diskussion, dessa är inte faktiska källradsnummer):
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 anropar PHP SET NAMES
på själva anslutningen (rad 3). PHP spårar också teckenuppsättningen just inställd (rad 10). Kommentarerna diskuterar vidare vad som händer med conn->charset
, men det räcker med att säga att det bara finns i get_charset
och mysql_real_escape_string
(och vänner).
Så om du inte bryr dig om detta tillstånd och du samtycker till att inte använda någondera get_charset
inte heller mysql_real_escape_string
, då kan du ringa SET NAMES
på själva anslutningen utan negativ effekt.
För övrigt har jag aldrig gjort det här, men det ser ut som att kompilera PHP med -DPHP_DEBUG=1
kommer att möjliggöra omfattande felsökning genom olika DBG
makron. Det kan vara användbart för att se hur din kod passerar genom detta block.