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

SET CHARACTER SET utf8 có cần thiết không?

Sử dụng SET CHARACTER SET utf8 sau khi sử dụng SET NAMES utf8 sẽ thực sự đặt lại character_set_connectioncollation_connection thành
@@character_set_database@@collation_database tương ứng.

hướng dẫn sử dụng nói rằng

  • SET NAMES x tương đương với

    SET character_set_client = x;
    SET character_set_results = x;
    SET character_set_connection = x;
    
  • SET CHARACTER SET x tương đương với

    SET 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>>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_databasecollation_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:

  1. MySQL coi truy vấn đến là được mã hóa trong character_set_client .
  2. MySQL mã hóa câu lệnh từ character_set_client thành character_set_connection
  3. 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.
  4. 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ành latin1 (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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách tốt nhất để phát triển / quản lý / thiết kế các nhiệm vụ / lịch định kỳ

  2. Cập nhật truy vấn với PDO và MySQL

  3. Cách an toàn để gửi thư qua PHP cho nhiều người dùng

  4. Làm cách nào để chọn 'chuỗi' dài nhất từ ​​bảng khi nhóm

  5. PHP &mySQL:Mã đơn giản để thực hiện Giao dịch - Cam kết &Khôi phục