Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

definir nomes vs mysqli_set_charset — além de afetar mysqli_escape_string, eles são idênticos?


Chamando SET NAMES na conexão é equivalente a chamar set_charset , desde que você não chame get_charset nem mysql_real_escape_string (e amigos).

Quando você chama set_charset , o PHP faz duas coisas. Primeiro, ele chama SET NAMES na conexão. Segundo, ele lembra qual charset você definiu. Essas informações de estado são usadas posteriormente apenas no get_charset e mysql_real_escape_string (e amigos) funções. Portanto, se você não usar essas funções, poderá considerar as duas equivalentes.

Vamos percorrer a fonte:
  1. Funções do Userland mysql_set_charset e mysqli_set_charset ligue...
  2. Função do mecanismo mysql_set_character_set chamadas...

  3. Macro do mecanismo mysqlnd_set_character_set , que é definido como:

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

    e se expande para...
  4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) que contém o código a seguir (numerado para discussão, estes não são números de linha de origem reais):
 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 você pode ver, o PHP chama SET NAMES na própria conexão (linha 3). O PHP também rastreia o conjunto de caracteres que acabou de ser definido (linha 10). Os comentários discutem ainda mais o que acontece com conn->charset , mas basta dizer que acaba sendo apenas em get_charset e mysql_real_escape_string (e amigos).

Portanto, se você não se importa com esse estado e concorda em usar nem get_charset nem mysql_real_escape_string , então você pode chamar SET NAMES na própria conexão sem nenhum efeito nocivo.

Como um aparte, e eu nunca fiz isso, mas parece compilar PHP com -DPHP_DEBUG=1 permitirá depuração substancial através de vários DBG macros. Isso pode ser útil para ver como seu código está passando por esse bloco.