Извикване на SET NAMES
на връзката е еквивалентно на извикване на set_charset
, при условие че не извикате нито get_charset
нито mysql_real_escape_string
(и приятели).
Когато извикате set_charset
, PHP прави две неща. Първо, той извиква SET NAMES
на връзката. Второ, той помни какъв набор от знаци сте задали. Информацията за това състояние по-късно се използва само в get_charset
и mysql_real_escape_string
(и приятели) функции. Следователно, ако не използвате тези функции, може да считате двете за еквивалентни.
Нека разгледаме източника:
- Функции на потребителя
mysql_set_charset
иmysqli_set_charset
обадете се... - Функция на двигателя
mysql_set_character_set
обаждания... -
Макрос на машината
mysqlnd_set_character_set
, което се дефинира като:#define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))
и се разширява до...
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)
който съдържа следния код (номериран за обсъждане, това не са действителни номера на изходните редове):
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 }
Както можете да видите, PHP извиква SET NAMES
на самата връзка (ред 3). PHP също проследява току-що зададения набор от знаци (ред 10). Коментарите допълнително обсъждат какво се случва с conn->charset
, но е достатъчно да кажем, че се оказва само в get_charset
и mysql_real_escape_string
(и приятели).
Така че, ако не ви интересува това състояние и се съгласявате да не използвате нито get_charset
нито mysql_real_escape_string
, тогава можете да извикате SET NAMES
върху самата връзка без вредни последици.
Като настрана, никога не съм правил това, но изглежда като компилиране на PHP с -DPHP_DEBUG=1
ще позволи значително отстраняване на грешки чрез различни DBG
макроси. Това може да е полезно, за да видите как вашият код преминава през този блок.