Volání SET NAMES na připojení je ekvivalentní volání set_charset , za předpokladu, že nevoláte ani get_charset ani mysql_real_escape_string (a přátelé).
Když zavoláte set_charset , PHP dělá dvě věci. Nejprve zavolá SET NAMES na připojení. Za druhé, pamatuje si, jakou znakovou sadu jste nastavili. Tyto informace o stavu se později použijí pouze v get_charset a mysql_real_escape_string (a přátelé) funkce. Pokud tedy tyto funkce nepoužíváte, můžete zvážit obě ekvivalentní.
Pojďme si projít zdroj:
- Funkce uživatelské země
mysql_set_charsetamysqli_set_charsetzavolejte... - Funkce motoru
mysql_set_character_sethovory... -
Makro motoru
mysqlnd_set_character_set, který je definován jako:#define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))a expanduje na...
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)který obsahuje následující kód (číslovaný pro diskusi, toto nejsou skutečná čísla zdrojových řádků):
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 můžete vidět, PHP volá SET NAMES na samotném připojení (řádek 3). PHP také sleduje právě nastavenou znakovou sadu (řádek 10). Komentáře dále diskutují o tom, co se stane s conn->charset , ale stačí říci, že skončí pouze v get_charset a mysql_real_escape_string (a přátelé).
Pokud vás tedy tento stav nezajímá a souhlasíte s tím, že nebudete používat ani get_charset ani mysql_real_escape_string , pak můžete zavolat SET NAMES na samotné připojení bez negativního dopadu.
Mimochodem, nikdy jsem to nedělal, ale vypadá to jako kompilace PHP s -DPHP_DEBUG=1 umožní podstatné ladění prostřednictvím různých DBG makra. To může být užitečné, abyste viděli, jak váš kód prochází tímto blokem.