sql >> Base de Datos >  >> RDS >> Mysql

establecer nombres frente a mysqli_set_charset:además de afectar a mysqli_escape_string, ¿son idénticos?

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:

  1. Funciones de la zona de usuario mysql_set_charset y mysqli_set_charset llamar...
  2. Función del motor mysql_set_character_set llamadas...
  3. 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...

  4. 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.