sql >> Database >  >> RDS >> Mysql

set-namen vs mysqli_set_charset - zijn ze, behalve dat ze van invloed zijn op mysqli_escape_string, identiek?

Bellen SET NAMES op de verbinding is gelijk aan het aanroepen van set_charset , op voorwaarde dat u geen van beide get_charset . aanroept noch mysql_real_escape_string (en vrienden).

Wanneer je set_charset . aanroept , PHP doet twee dingen. Eerst roept het SET NAMES . aan op de verbinding. Ten tweede onthoudt het welke tekenset je hebt ingesteld. Die statusinformatie wordt later alleen gebruikt in de get_charset en mysql_real_escape_string (en vrienden) functies. Daarom, als u deze functies niet gebruikt, kunt u de twee equivalenten overwegen.

Laten we de bron bekijken:

  1. Gebruikersfuncties mysql_set_charset en mysqli_set_charset bel...
  2. Motorfunctie mysql_set_character_set belt...
  3. Enginemacro mysqlnd_set_character_set , wat is gedefinieerd als:

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

    en breidt uit naar...

  4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) die bevat de volgende code (genummerd voor discussie, dit zijn geen echte bronregelnummers):
 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   }

Zoals je kunt zien, roept PHP SET NAMES aan op de verbinding zelf (lijn 3). PHP volgt ook de zojuist ingestelde tekenset (regel 10). De opmerkingen gaan verder in op wat er gebeurt met conn->charset , maar het volstaat te zeggen dat het uiteindelijk alleen in get_charset staat en mysql_real_escape_string (en vrienden).

Dus, als u niet geïnteresseerd bent in deze status, en u stemt ermee in om geen van beide get_charset te gebruiken noch mysql_real_escape_string , dan mag je SET NAMES . noemen op de verbinding zelf zonder nadelige gevolgen.

Even terzijde, en ik heb dit nog nooit gedaan, maar het lijkt op het compileren van PHP met -DPHP_DEBUG=1 maakt substantiële foutopsporing mogelijk via verschillende DBG macro's. Dat kan handig zijn om te zien hoe uw code door dit blok gaat.



  1. bbPress:Hoe vind je toewijzingen van bijlagen bij hun respectievelijke berichten

  2. Vervang een woord in BLOB-tekst door MySQL

  3. InnoDB-partities importeren in MariaDB 10.0/10.1

  4. Android Studio controleert/markeert Kotlin Room DAO-query's niet wanneer string meer dan 1 rij beslaat