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_charset
amysqli_set_charset
zavolejte... - Funkce motoru
mysql_set_character_set
hovory... -
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.