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_charset
imysqli_set_charset
zadzwoń... - Funkcja silnika
mysql_set_character_set
połą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.