Sử dụng SET CHARACTER SET utf8
sau khi sử dụng SET NAMES utf8
sẽ thực sự đặt lại character_set_connection
và collation_connection
thành
@@character_set_database
và @@collation_database
tương ứng.
hướng dẫn sử dụng nói rằng
-
SET NAMES x
tương đương vớiSET character_set_client = x; SET character_set_results = x; SET character_set_connection = x;
-
và
SET CHARACTER SET x
tương đương vớiSET character_set_client = x; SET character_set_results = x; SET collation_connection = @@collation_database;
trong khi SET collation_connection = x
cũng thực thi nội bộ SET character_set_connection = <<character_set_of_collation_x>>
và SET character_set_connection = x
nội bộ cũng thực thi SET collation_connection = <<default_collation_of_character_set_x
.
Vì vậy, về cơ bản bạn đang đặt lại character_set_connection
tới @@character_set_database
và collation_connection
tới @@collation_database
. Sách hướng dẫn giải thích cách sử dụng các biến này:
Tóm lại, quy trình mã hóa / chuyển mã MySQL sử dụng để xử lý truy vấn và kết quả của nó là một bước gồm nhiều bước:
- MySQL coi truy vấn đến là được mã hóa trong
character_set_client
. - MySQL mã hóa câu lệnh từ
character_set_client
thànhcharacter_set_connection
- khi so sánh giá trị chuỗi với giá trị cột, MySQL mã hóa giá trị chuỗi từ
character_set_connection
vào bộ ký tự của cột cơ sở dữ liệu nhất định và sử dụng đối chiếu cột để sắp xếp và so sánh. - MySQL xây dựng tập kết quả được mã hóa trong
character_set_results
(điều này bao gồm dữ liệu kết quả cũng như siêu dữ liệu kết quả, chẳng hạn như tên cột, v.v.)
Vì vậy, nó có thể là trường hợp SET CHARACTER SET utf8
sẽ không đủ để cung cấp hỗ trợ UTF-8 đầy đủ. Hãy nghĩ về bộ ký tự cơ sở dữ liệu mặc định là latin1
và các cột được xác định bằng utf8
-charset và thực hiện các bước được mô tả ở trên. Dưới dạng latin1
không thể bao gồm tất cả các ký tự mà UTF-8 có thể che, bạn có thể mất thông tin ký tự trong bước 3 .
- Bước 3 : Cho rằng truy vấn của bạn được mã hóa bằng UTF-8 và chứa các ký tự không thể được biểu diễn bằng
latin1
, các ký tự này sẽ bị mất khi chuyển mã từutf8
thànhlatin1
(bộ ký tự cơ sở dữ liệu mặc định) khiến truy vấn của bạn không thành công.
Vì vậy, tôi nghĩ rằng có thể an toàn khi nói rằng SET NAMES ...
là cách chính xác để xử lý các vấn đề về bộ ký tự. Mặc dù tôi có thể thêm rằng việc thiết lập các biến máy chủ MySQL của bạn một cách chính xác (tất cả các biến bắt buộc có thể được đặt tĩnh trong my.cnf
của bạn ) giải phóng bạn khỏi chi phí hiệu suất của truy vấn bổ sung cần thiết trên mọi kết nối.