Wywołanie SET NAMES na połączeniu jest równoznaczne z wywołaniem set_charset , pod warunkiem, że nie wywołasz żadnego get_charset ani mysql_real_escape_string (i przyjaciele).
Kiedy dzwonisz do set_charset , PHP robi dwie rzeczy. Najpierw wywołuje SET NAMES na połączeniu. Po drugie, zapamiętuje ustawiony zestaw znaków. Te informacje o stanie są później używane tylko w get_charset i mysql_real_escape_string (i znajomych) funkcje. Dlatego, jeśli nie używasz tych funkcji, możesz rozważyć oba równoważne.
Przejdźmy do źródła:
- Funkcje w przestrzeni użytkownika
mysql_set_charsetimysqli_set_charsetzadzwoń... - Funkcja silnika
mysql_set_character_setpołączenia... -
Makro silnika
mysqlnd_set_character_set, który jest zdefiniowany jako:#define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))i rozszerza się do...
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)który zawiera następujący kod (ponumerowany do dyskusji, nie są to rzeczywiste numery linii źródłowych):
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 }
Jak widać, PHP wywołuje SET NAMES na samym połączeniu (wiersz 3). PHP śledzi również właśnie ustawiony zestaw znaków (linia 10). Komentarze dalej omawiają, co dzieje się z conn->charset , ale wystarczy powiedzieć, że kończy się tylko w get_charset i mysql_real_escape_string (i przyjaciele).
Tak więc, jeśli nie zależy Ci na tym stanie i zgadzasz się nie używać żadnego get_charset ani mysql_real_escape_string , możesz zadzwonić SET NAMES na samym połączeniu bez złego wpływu.
Na marginesie, nigdy tego nie robiłem, ale wygląda na to, że kompiluję PHP z -DPHP_DEBUG=1 umożliwi znaczne debugowanie przez różne DBG makra. Może to być przydatne przy sprawdzaniu, jak Twój kod przechodzi przez ten blok.