Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

đặt tên so với mysqli_set_charset - ngoài việc ảnh hưởng đến mysqli_escape_string, chúng có giống nhau không?

Gọi SET NAMES trên kết nối tương đương với gọi set_charset , miễn là bạn không gọi get_charset cũng không phải mysql_real_escape_string (và bạn bè).

Khi bạn gọi set_charset , PHP thực hiện hai điều. Đầu tiên, nó gọi SET NAMES trên kết nối. Thứ hai, nó ghi nhớ bộ ký tự bạn đã đặt. Thông tin trạng thái đó sau đó chỉ được sử dụng trong get_charsetmysql_real_escape_string (và bạn bè) chức năng. Do đó, nếu bạn không sử dụng các chức năng này, thì bạn có thể coi hai chức năng tương đương.

Hãy dạo qua nguồn:

  1. Các hàm của vùng người dùng mysql_set_charsetmysqli_set_charset gọi ...
  2. Chức năng công cụ mysql_set_character_set cuộc gọi ...
  3. Macro động cơ mysqlnd_set_character_set , được định nghĩa là:

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

    và mở rộng thành ...

  4. MYSQLND_METHOD(mysqlnd_conn_data, set_charset) chứa mã sau (được đánh số để thảo luận, đây không phải là số dòng nguồn thực tế):
 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   }

Như bạn thấy, PHP gọi SET NAMES trên chính kết nối (dòng 3). PHP cũng theo dõi bộ ký tự vừa đặt (dòng 10). Các nhận xét thảo luận thêm về những gì xảy ra với conn->charset , nhưng đủ để nói rằng nó kết thúc chỉ trong get_charsetmysql_real_escape_string (và bạn bè).

Vì vậy, nếu bạn không quan tâm đến trạng thái này và bạn đồng ý không sử dụng get_charset cũng không phải mysql_real_escape_string , sau đó bạn có thể gọi SET NAMES trên chính kết nối mà không ảnh hưởng xấu.

Ngoài ra, tôi chưa bao giờ làm việc này, nhưng có vẻ như đang biên dịch PHP với -DPHP_DEBUG=1 sẽ cho phép gỡ lỗi đáng kể thông qua các DBG khác nhau macro. Điều đó có thể hữu ích trong việc xem cách mã của bạn đi qua khối này.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Chọn các hàng vào lần xuất hiện đầu tiên của mỗi giá trị duy nhất

  2. Làm thế nào để lấy danh sách các vùng ngoại ô xung quanh một vị trí sau đó lặp lại cho các vị trí khác bằng MySql?

  3. Với MySQL, làm cách nào để tạo cột chứa chỉ mục bản ghi trong bảng?

  4. Không thể nâng cấp SonarQube từ 4.5.2 lên 5.0

  5. Cách đúng để khử trùng đầu vào trong MySQL bằng PDO