sql >> Databáze >  >> RDS >> Mysql

názvy sad vs mysqli_set_charset — kromě ovlivnění mysqli_escape_string, jsou totožné?

Volání SET NAMES na připojení je ekvivalentní volání set_charset , za předpokladu, že nevoláte ani get_charset ani mysql_real_escape_string (a přátelé).

Když zavoláte set_charset , PHP dělá dvě věci. Nejprve zavolá SET NAMES na připojení. Za druhé, pamatuje si, jakou znakovou sadu jste nastavili. Tyto informace o stavu se později použijí pouze v get_charset a mysql_real_escape_string (a přátelé) funkce. Pokud tedy tyto funkce nepoužíváte, můžete zvážit obě ekvivalentní.

Pojďme si projít zdroj:

  1. Funkce uživatelské země mysql_set_charset a mysqli_set_charset zavolejte...
  2. Funkce motoru mysql_set_character_set hovory...
  3. Makro motoru mysqlnd_set_character_set , který je definován jako:

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

    a expanduje na...

  4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) který obsahuje následující kód (číslovaný pro diskusi, toto nejsou skutečná čísla zdrojových řádků):
 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   }

Jak můžete vidět, PHP volá SET NAMES na samotném připojení (řádek 3). PHP také sleduje právě nastavenou znakovou sadu (řádek 10). Komentáře dále diskutují o tom, co se stane s conn->charset , ale stačí říci, že skončí pouze v get_charset a mysql_real_escape_string (a přátelé).

Pokud vás tedy tento stav nezajímá a souhlasíte s tím, že nebudete používat ani get_charset ani mysql_real_escape_string , pak můžete zavolat SET NAMES na samotné připojení bez negativního dopadu.

Mimochodem, nikdy jsem to nedělal, ale vypadá to jako kompilace PHP s -DPHP_DEBUG=1 umožní podstatné ladění prostřednictvím různých DBG makra. To může být užitečné, abyste viděli, jak váš kód prochází tímto blokem.



  1. Nalezení přesné hodnoty z řetězce odděleného čárkou v PHP MySQL

  2. zobrazení odkazu v php

  3. Připojení oci_connect se nezdařilo

  4. Vyberte první a poslední časové razítko, kde je ID uživatele jedinečné