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:
- Userland-Funktionen
mysql_set_charset
undmysqli_set_charset
anrufen... - Engine-Funktion
mysql_set_character_set
Anrufe... -
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...
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.