Mysql
 sql >> Baza danych >  >> RDS >> Mysql

set names vs mysqli_set_charset — poza wpływem na mysqli_escape_string, czy są one identyczne?

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:

  1. Funkcje w przestrzeni użytkownika mysql_set_charset i mysqli_set_charset zadzwoń...
  2. Funkcja silnika mysql_set_character_set połączenia...
  3. 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...

  4. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyszukiwanie geograficzne MYSQL z wydajnością na odległość

  2. Zapytanie Mysql do wyodrębnienia domen z adresów URL

  3. Jak wysłać zapytanie do sql z aktywnym rekordem dla dat między określonymi godzinami?

  4. Jak zamienić znaki nieliczbowe w MySQL?

  5. Jak zwrócić tabelę za pomocą funkcji mysql?