Mysql
 sql >> Base de données >  >> RDS >> Mysql

set names vs mysqli_set_charset - en plus d'affecter mysqli_escape_string, sont-ils identiques ?

Appeler SET NAMES sur la connexion équivaut à appeler set_charset , à condition que vous n'appeliez ni get_charset ni mysql_real_escape_string (et amis).

Lorsque vous appelez set_charset , PHP fait deux choses. Tout d'abord, il appelle SET NAMES sur la connexion. Deuxièmement, il se souvient du jeu de caractères que vous avez défini. Cette information d'état est ensuite utilisée uniquement dans le get_charset et mysql_real_escape_string (et amis). Par conséquent, si vous n'utilisez pas ces fonctions, vous pouvez envisager les deux équivalents.

Parcourons la source :

  1. Fonctions utilisateur mysql_set_charset et mysqli_set_charset appeler...
  2. Fonction moteur mysql_set_character_set appels...
  3. Macro moteur mysqlnd_set_character_set , qui est défini comme :

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

    et s'étend jusqu'à...

  4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) qui contient le code suivant (numéroté pour discussion, il ne s'agit pas de numéros de ligne source réels) :
 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   }

Comme vous pouvez le voir, PHP appelle SET NAMES sur la connexion elle-même (ligne 3). PHP suit également le jeu de caractères qui vient d'être défini (ligne 10). Les commentaires discutent plus en détail de ce qui se passe avec conn->charset , mais il suffit de dire qu'il se retrouve uniquement dans get_charset et mysql_real_escape_string (et amis).

Donc, si vous ne vous souciez pas de cet état et que vous acceptez de n'utiliser ni get_charset ni mysql_real_escape_string , alors vous pouvez appeler SET NAMES sur la connexion elle-même sans effet néfaste.

En aparté, et je n'ai jamais fait cela, mais cela ressemble à compiler PHP avec -DPHP_DEBUG=1 permettra un débogage substantiel via divers DBG macros. Cela peut être utile pour voir comment votre code traverse ce bloc.