Mysql
 sql >> Datenbank >  >> RDS >> Mysql

set names vs mysqli_set_charset – abgesehen davon, dass sie mysqli_escape_string beeinflussen, sind sie identisch?

Aufruf von SET NAMES auf der Verbindung entspricht dem Aufruf von set_charset , sofern Sie weder get_charset aufrufen noch mysql_real_escape_string (und Freunde).

Wenn Sie set_charset aufrufen , macht PHP zwei Dinge. Zuerst ruft es SET NAMES auf auf der Verbindung. Zweitens merkt es sich, welchen Zeichensatz Sie eingestellt haben. Diese Zustandsinformationen werden später nur in get_charset verwendet und mysql_real_escape_string (und Freunde) Funktionen. Wenn Sie diese Funktionen nicht verwenden, können Sie daher die beiden Äquivalente in Betracht ziehen.

Gehen wir der Quelle auf den Grund:

  1. Userland-Funktionen mysql_set_charset und mysqli_set_charset anrufen...
  2. Engine-Funktion mysql_set_character_set Anrufe...
  3. Engine-Makro mysqlnd_set_character_set , die wie folgt definiert ist:

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

    und expandiert zu...

  4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) welches enthält der folgende Code (zur Diskussion nummeriert, dies sind keine tatsächlichen Quellzeilennummern):
 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   }

Wie Sie sehen können, ruft PHP SET NAMES auf auf der Verbindung selbst (Zeile 3). PHP verfolgt auch den gerade gesetzten Zeichensatz (Zeile 10). Die Kommentare besprechen weiter, was mit conn->charset passiert , aber es genügt zu sagen, dass es sich nur in get_charset befindet und mysql_real_escape_string (und Freunde).

Also, wenn Ihnen dieser Zustand egal ist und Sie zustimmen, weder get_charset zu verwenden noch mysql_real_escape_string , dann kannst du SET NAMES aufrufen auf die Verbindung selbst ohne negative Auswirkungen.

Nebenbei, und ich habe das noch nie gemacht, aber es sieht so aus, als würde man PHP mit -DPHP_DEBUG=1 kompilieren wird umfangreiches Debugging durch verschiedene DBG ermöglichen Makros. Das kann nützlich sein, um zu sehen, wie Ihr Code diesen Block durchläuft.