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_charset
vàmysqli_set_charset
gọi ... - Chức năng công cụ
mysql_set_character_set
cuộ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.