sql >> Database teknologi >  >> RDS >> Mysql

sætnavne vs mysqli_set_charset — udover at påvirke mysqli_escape_string, er de identiske?

Ringer til SET NAMES på forbindelsen svarer til at kalde set_charset , forudsat at du hverken kalder get_charset heller ikke mysql_real_escape_string (og venner).

Når du kalder set_charset , PHP gør to ting. Først kalder den SET NAMES på forbindelsen. For det andet husker den, hvilket tegnsæt du har angivet. Denne tilstandsinformation bruges senere kun i get_charset og mysql_real_escape_string (og venner) funktioner. Derfor, hvis du ikke bruger disse funktioner, kan du overveje de to tilsvarende.

Lad os gå kilden:

  1. Brugerlandsfunktioner mysql_set_charset og mysqli_set_charset ring...
  2. Motorfunktion mysql_set_character_set opkald...
  3. Motormakro mysqlnd_set_character_set , som er defineret som:

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

    og udvides til...

  4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) som indeholder følgende kode (nummereret til diskussion, disse er ikke faktiske kildelinjenumre):
 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   }

Som du kan se, kalder PHP SET NAMES på selve forbindelsen (linje 3). PHP sporer også det netop indstillede tegnsæt (linje 10). Kommentarerne diskuterer yderligere, hvad der sker med conn->charset , men det er nok at sige, at det kun ender i get_charset og mysql_real_escape_string (og venner).

Så hvis du er ligeglad med denne tilstand, og du accepterer hverken at bruge get_charset heller ikke mysql_real_escape_string , så kan du kalde SET NAMES på selve forbindelsen uden dårlig effekt.

Som en sidebemærkning, og jeg har aldrig gjort dette, men det ligner at kompilere PHP med -DPHP_DEBUG=1 vil muliggøre væsentlig debugging gennem forskellige DBG makroer. Det kan være nyttigt for at se, hvordan din kode passerer gennem denne blok.



  1. MySQL fejlkode 1235

  2. Hvad er SQL Server RAISERROR?

  3. Gem output fra sql-funktion til csv-fil (COPY) med dynamisk filnavn

  4. mysql_num_rows() forventer, at parameter 1 er ressource, boolesk givet ind