Mysql
 sql >> база данни >  >> RDS >> Mysql

имена на набори срещу mysqli_set_charset — освен че засягат mysqli_escape_string, те идентични ли са?

Извикване на SET NAMES на връзката е еквивалентно на извикване на set_charset , при условие че не извикате нито get_charset нито mysql_real_escape_string (и приятели).

Когато извикате set_charset , PHP прави две неща. Първо, той извиква SET NAMES на връзката. Второ, той помни какъв набор от знаци сте задали. Информацията за това състояние по-късно се използва само в get_charset и mysql_real_escape_string (и приятели) функции. Следователно, ако не използвате тези функции, може да считате двете за еквивалентни.

Нека разгледаме източника:

  1. Функции на потребителя mysql_set_charset и mysqli_set_charset обадете се...
  2. Функция на двигателя mysql_set_character_set обаждания...
  3. Макрос на машината mysqlnd_set_character_set , което се дефинира като:

    #define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))

    и се разширява до...

  4. 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 макроси. Това може да е полезно, за да видите как вашият код преминава през този блок.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Преобразуване на разделен низ в множество стойности в mysql

  2. Не може да се съхранява арабски в базата данни MYSQL с помощта на PHP

  3. PHP и mySQL - написани като ë

  4. Възел Mysql не може да постави заявка след извикване quit

  5. Как да форматирате числа в MySQL