Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

atur nama vs mysqli_set_charset — selain memengaruhi mysqli_escape_string, apakah identik?

Memanggil SET NAMES pada koneksi sama dengan memanggil set_charset , asalkan Anda tidak memanggil get_charset atau mysql_real_escape_string (dan teman-teman).

Saat Anda memanggil set_charset , PHP melakukan dua hal. Pertama, ia memanggil SET NAMES pada sambungan. Kedua, ia mengingat rangkaian karakter apa yang Anda tetapkan. Informasi status tersebut nantinya hanya digunakan di get_charset dan mysql_real_escape_string (dan teman-teman) fungsi. Oleh karena itu, jika Anda tidak menggunakan fungsi-fungsi ini, Anda dapat mempertimbangkan keduanya yang setara.

Mari kita telusuri sumbernya:

  1. Fungsi Userland mysql_set_charset dan mysqli_set_charset hubungi...
  2. Fungsi mesin mysql_set_character_set panggilan...
  3. Makro mesin mysqlnd_set_character_set , yang didefinisikan sebagai:

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

    dan diperluas ke...

  4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) yang berisi kode berikut (diberi nomor untuk diskusi, ini bukan nomor baris sumber yang sebenarnya):
 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   }

Seperti yang Anda lihat, PHP memanggil SET NAMES pada sambungan itu sendiri (baris 3). PHP juga melacak rangkaian karakter yang baru saja disetel (baris 10). Komentar lebih lanjut membahas apa yang terjadi dengan conn->charset , tetapi cukup untuk mengatakan bahwa akhirnya hanya berada di get_charset dan mysql_real_escape_string (dan teman-teman).

Jadi, jika Anda tidak peduli dengan status ini, dan Anda setuju untuk tidak menggunakan get_charset atau mysql_real_escape_string , maka Anda dapat memanggil SET NAMES pada koneksi itu sendiri tanpa efek buruk.

Sebagai tambahan, dan saya belum pernah melakukan ini, tetapi sepertinya mengkompilasi PHP dengan -DPHP_DEBUG=1 akan mengaktifkan debugging substansial melalui berbagai DBG makro. Itu mungkin berguna untuk melihat bagaimana kode Anda melewati blok ini.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbandingan MySQL dengan nilai nol

  2. Apakah MySQL menghilangkan subekspresi umum antara klausa SELECT dan HAVING/GROUP BY?

  3. Instalasi Neo4j

  4. Aplikasi Android Xamarin dengan database MySql/Sql online

  5. Cara menulis kueri bergabung di Volusion API