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

UTF-8 xuyên suốt

Lưu trữ dữ liệu :

  • Chỉ định utf8mb4 bộ ký tự trên tất cả các bảng và cột văn bản trong cơ sở dữ liệu của bạn. Điều này làm cho MySQL lưu trữ vật lý và truy xuất các giá trị được mã hóa nguyên bản trong UTF-8. Lưu ý rằng MySQL sẽ ngầm sử dụng utf8mb4 mã hóa nếu một utf8mb4_ * đối chiếu được chỉ định (không có bất kỳ bộ ký tự rõ ràng nào).

  • Trong các phiên bản MySQL cũ hơn (<5.5.3), bạn sẽ không may bị buộc chỉ sử dụng utf8 , chỉ hỗ trợ một tập hợp con các ký tự Unicode. Tôi ước tôi đang đùa.

Quyền truy cập dữ liệu :

  • Trong mã ứng dụng của bạn (ví dụ:PHP), trong bất kỳ phương thức truy cập DB nào bạn sử dụng, bạn sẽ cần đặt bộ ký tự kết nối thành utf8mb4 . Bằng cách này, MySQL không chuyển đổi từ UTF-8 gốc của nó khi nó chuyển dữ liệu cho ứng dụng của bạn và ngược lại.

  • Một số trình điều khiển cung cấp cơ chế riêng của họ để định cấu hình bộ ký tự kết nối, cả hai đều cập nhật trạng thái bên trong của chính nó và thông báo cho MySQL về mã hóa sẽ được sử dụng trên kết nối — đây thường là cách tiếp cận được ưu tiên. Trong PHP:

    • Nếu bạn đang sử dụng PDO lớp trừu tượng với PHP ≥ 5.3.6, bạn có thể chỉ định bộ ký tự trong DSN :

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Nếu bạn đang sử dụng mysqli , bạn có thể gọi set_charset () :

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Nếu bạn gặp khó khăn với mysql đơn giản nhưng tình cờ đang chạy PHP ≥ 5.2.3, bạn có thể gọi mysql_set_charset .

  • Nếu trình điều khiển không cung cấp cơ chế riêng để đặt bộ ký tự kết nối, bạn có thể phải đưa ra truy vấn để cho MySQL biết ứng dụng của bạn mong muốn dữ liệu trên kết nối được mã hóa như thế nào: ĐẶT TÊN 'utf8mb4' .

  • Sự cân nhắc tương tự đối với utf8mb4 / utf8 áp dụng như trên.

Đầu ra :

  • Nếu ứng dụng của bạn truyền văn bản đến các hệ thống khác, chúng cũng sẽ cần được thông báo về mã hóa ký tự. Với các ứng dụng web, trình duyệt phải được thông báo về kiểu mã hóa mà dữ liệu được gửi (thông qua tiêu đề phản hồi HTTP hoặc siêu dữ liệu HTML ).

  • Trong PHP, bạn có thể sử dụng default_charset tùy chọn php.ini hoặc phát hành Content-Type theo cách thủ công Bản thân tiêu đề MIME, chỉ là công việc nhiều hơn nhưng có tác dụng tương tự.

  • Khi mã hóa đầu ra bằng json_encode () , thêm JSON_UNESCAPED_UNICODE dưới dạng tham số thứ hai.

Đầu vào :

  • Thật không may, bạn nên xác minh mọi chuỗi nhận được là UTF-8 hợp lệ trước khi bạn cố gắng lưu trữ hoặc sử dụng nó ở bất kỳ đâu. PHP của mb_check_encoding () là thủ thuật, nhưng bạn phải sử dụng nó một cách tôn giáo. Thực sự không có cách nào để giải quyết vấn đề này, vì các máy khách độc hại có thể gửi dữ liệu bằng bất kỳ kiểu mã hóa nào họ muốn và tôi chưa tìm ra mẹo nào để khiến PHP thực hiện việc này một cách đáng tin cậy.

  • Từ việc tôi đọc thông số kỹ thuật HTML hiện tại của tôi , các dấu đầu dòng sau không cần thiết hoặc thậm chí còn hợp lệ đối với HTML hiện đại. Sự hiểu biết của tôi là các trình duyệt sẽ làm việc với và gửi dữ liệu trong bộ ký tự được chỉ định cho tài liệu. Tuy nhiên, nếu bạn đang nhắm mục tiêu các phiên bản HTML cũ hơn (XHTML, HTML4, v.v.), những điểm này có thể vẫn hữu ích:

    • Chỉ dành cho HTML trước HTML5 :bạn muốn tất cả dữ liệu do trình duyệt gửi cho bạn ở dạng UTF-8. Thật không may, nếu bạn đi theo cách duy nhất để làm điều này một cách đáng tin cậy là thêm bộ ký tự chấp nhận thuộc tính cho tất cả
      của bạn các thẻ: .
    • Chỉ dành cho HTML trước HTML5 :lưu ý rằng thông số kỹ thuật HTML của W3C nói rằng máy khách "nên" mặc định gửi biểu mẫu trở lại máy chủ trong bất kỳ bộ ký tự nào mà máy chủ phân phối, nhưng đây rõ ràng chỉ là một đề xuất, do đó cần phải rõ ràng trên mỗi thẻ.

Cân nhắc mã khác :

  • Rõ ràng là đủ, tất cả các tệp bạn sẽ phân phát (PHP, HTML, JavaScript, v.v.) phải được mã hóa bằng UTF-8 hợp lệ.

  • Bạn cần đảm bảo rằng mỗi khi bạn xử lý chuỗi UTF-8, bạn làm như vậy một cách an toàn. Thật không may, đây là phần khó. Có thể bạn sẽ muốn sử dụng rộng rãi mbstring phần mở rộng.

  • Các hoạt động chuỗi tích hợp của PHP không theo mặc định UTF-8 an toàn. Có một số điều bạn có thể làm một cách an toàn với các hoạt động chuỗi PHP bình thường (như nối), nhưng đối với hầu hết mọi thứ, bạn nên sử dụng mbstring tương đương chức năng.

  • Để biết bạn đang làm gì (đọc:không làm rối nó lên), bạn thực sự cần biết UTF-8 và cách nó hoạt động ở mức thấp nhất có thể. Kiểm tra bất kỳ liên kết nào từ utf8.com để có một số tài nguyên tốt để tìm hiểu mọi thứ bạn cần biết.



  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ạo thủ tục lưu trữ trong MySQL

  2. Mệnh đề INNER JOIN ON so với WHERE

  3. Cách thay đổi mật khẩu gốc của MySQL hoặc MariaDB trong Linux

  4. Cách giữ lại phản ứng dữ dội khi thoát khỏi trích dẫn trong MySQL - QUOTE ()

  5. Làm thế nào để kiểm tra xem một chuỗi có phải là JSON hay không?