Llamando a SET NAMES
en la conexión es equivalente a llamar a set_charset
, siempre que no llame a get_charset
ni mysql_real_escape_string
(y amigos).
Cuando llamas a set_charset
, PHP hace dos cosas. Primero, llama a SET NAMES
en la conexión. En segundo lugar, recuerda qué conjunto de caracteres configuraste. Esa información de estado se usa luego solo en el get_charset
y mysql_real_escape_string
(y amigos) funciones. Por lo tanto, si no usa estas funciones, puede considerar las dos equivalentes.
Recorramos la fuente:
- Funciones de la zona de usuario
mysql_set_charset
ymysqli_set_charset
llamar... - Función del motor
mysql_set_character_set
llamadas... -
Macro del motor
mysqlnd_set_character_set
, que se define como:#define mysqlnd_set_character_set(conn, cs) \ ((conn)->data)->m->set_charset((conn)->data, (cs)))
y se expande a...
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)
que contiene el siguiente código (numerado para discusión, estos no son números de línea fuente reales):
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 }
Como puede ver, PHP llama a SET NAMES
en la propia conexión (línea 3). PHP también rastrea el juego de caracteres recién establecido (línea 10). Los comentarios analizan más a fondo lo que sucede con conn->charset
, pero baste decir que termina estando solo en get_charset
y mysql_real_escape_string
(y amigos).
Entonces, si no le importa este estado y acepta no usar get_charset
ni mysql_real_escape_string
, entonces puedes llamar a SET NAMES
en la conexión en sí sin ningún efecto negativo.
Aparte, nunca he hecho esto, pero parece compilar PHP con -DPHP_DEBUG=1
habilitará una depuración sustancial a través de varios DBG
macros Eso puede ser útil para ver cómo pasa su código a través de este bloque.