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_charset và mysql_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:
- Các hàm của vùng người dùng
mysql_set_charsetvàmysqli_set_charsetgọi ... - Chức năng công cụ
mysql_set_character_setcuộc gọi ... -
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 ...
-
MYSQLND_METHOD(mysqlnd_conn_data, set_charset)mà 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_charset và mysql_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.