sql >> Databasteknik >  >> RDS >> Mysql

set names vs mysqli_set_charset — förutom att påverka mysqli_escape_string, är de identiska?

Ringer SET NAMES på anslutningen motsvarar att anropa set_charset , förutsatt att du inte anropar get_charset inte heller mysql_real_escape_string (och vänner).

När du anropar set_charset , PHP gör två saker. Först anropar den SET NAMES på anslutningen. För det andra kommer den ihåg vilken teckenuppsättning du ställt in. Den tillståndsinformationen används senare endast i get_charset och mysql_real_escape_string (och vänner) funktioner. Därför, om du inte använder dessa funktioner, kan du överväga de två motsvarigheten.

Låt oss gå källan:

  1. Användarlandsfunktioner mysql_set_charset och mysqli_set_charset ring...
  2. Motorfunktion mysql_set_character_set samtal...
  3. Motormakro mysqlnd_set_character_set , som definieras som:

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

    och expanderar till...

  4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) som innehåller följande kod (numrerad för diskussion, dessa är inte faktiska källradsnummer):
 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 anropar PHP SET NAMES på själva anslutningen (rad 3). PHP spårar också teckenuppsättningen just inställd (rad 10). Kommentarerna diskuterar vidare vad som händer med conn->charset , men det räcker med att säga att det bara finns i get_charset och mysql_real_escape_string (och vänner).

Så om du inte bryr dig om detta tillstånd och du samtycker till att inte använda någondera get_charset inte heller mysql_real_escape_string , då kan du ringa SET NAMES på själva anslutningen utan negativ effekt.

För övrigt har jag aldrig gjort det här, men det ser ut som att kompilera PHP med -DPHP_DEBUG=1 kommer att möjliggöra omfattande felsökning genom olika DBG makron. Det kan vara användbart för att se hur din kod passerar genom detta block.



  1. Tips för att lagra PostgreSQL-säkerhetskopior på Amazon AWS

  2. mysql skiftlägeskänslig i utf8_general_ci

  3. Sequelize bulkCreate() returnerar NULL-värdet för primärnyckeln

  4. Hur skapar man en SQL Server-funktion för att sammanfoga flera rader från en underfråga till ett enda avgränsat fält?