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 :
- Fonctions utilisateur
mysql_set_charset
etmysqli_set_charset
appeler... - Fonction moteur
mysql_set_character_set
appels... -
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'à...
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.