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

MySQL và PHP:UTF-8 với các ký tự Cyrillic

Bạn đang trộn các API ở đây, mysql_*mysqli_* không trộn lẫn. Bạn nên gắn bó với mysqli_ (có vẻ như bạn vẫn vậy), với tư cách là mysql_* các hàm không được dùng nữa và bị loại bỏ hoàn toàn trong PHP7.

Vấn đề thực tế của bạn là một vấn đề bộ ký tự ở đâu đó. Dưới đây là một số gợi ý có thể giúp bạn có được bộ ký tự phù hợp cho ứng dụng của mình. Điều này bao gồm hầu hết những vấn đề chung mà người ta có thể gặp phải khi phát triển một ứng dụng PHP / MySQL.

  • TẤT CẢ các thuộc tính trong toàn bộ ứng dụng của bạn phải được đặt thành UTF-8
  • Lưu tài liệu dưới dạng UTF-8 w / o BOM (Nếu bạn đang sử dụng Notepad ++, đó là Format -> Convert to UTF-8 w/o BOM )
  • Tiêu đề trong cả PHP và HTML phải được đặt thành UTF-8

    • HTML (bên trong <head></head> thẻ):

      <meta charset="UTF-8">
      
    • PHP (ở đầu tệp của bạn, trước bất kỳ đầu ra nào):

      header('Content-Type: text/html; charset=utf-8');
      
  • Khi kết nối với cơ sở dữ liệu, hãy đặt bộ ký tự thành UTF-8 cho đối tượng kết nối của bạn, như thế này (trực tiếp sau khi kết nối)

    mysqli_set_charset($conn, "utf8"); /* Procedural approach */
    $conn->set_charset("utf8");        /* Object-oriented approach */
    

    Điều này dành cho mysqli_* , có những cái tương tự cho mysql_* và PDO (xem phần cuối của câu trả lời này).

  • Ngoài ra, hãy đảm bảo rằng cơ sở dữ liệu và bảng của bạn được đặt thành UTF-8, bạn có thể làm như thế này:

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

    (Mọi dữ liệu đã được lưu trữ sẽ không được chuyển đổi sang bộ ký tự thích hợp, vì vậy bạn sẽ cần thực hiện việc này với cơ sở dữ liệu sạch hoặc cập nhật dữ liệu sau khi thực hiện việc này nếu có ký tự bị hỏng).

  • Nếu bạn đang sử dụng json_encode() , bạn có thể cần áp dụng JSON_UNESCAPED_UNICODE cờ, nếu không nó sẽ chuyển đổi các ký tự đặc biệt sang hệ thập lục phân tương đương của chúng.

Hãy nhớ rằng MỌI THỨ trong toàn bộ đường dẫn mã của bạn cần được đặt thành UFT-8, nếu không, bạn có thể gặp phải các ký tự bị hỏng trong ứng dụng của mình.

Ngoài danh sách này, có thể có các hàm có một tham số cụ thể để chỉ định một bộ ký tự. Sách hướng dẫn sẽ cho bạn biết về điều này (ví dụ là htmlspecialchars() ).

Ngoài ra còn có các hàm đặc biệt cho các ký tự nhiều byte, ví dụ:strtolower() sẽ không hạ thấp các ký tự nhiềubyte, do đó bạn sẽ phải sử dụng mb_strtolower() , hãy xem bản trình diễn trực tiếp này .

Lưu ý 1 :Lưu ý rằng nơi nào đó của nó được ghi chú là utf-8 (có dấu gạch ngang) và ở đâu đó là utf8 (không có nó). Điều quan trọng là bạn phải biết khi nào sử dụng cái nào, vì chúng thường không thể hoán đổi cho nhau. Ví dụ:HTML và PHP muốn utf-8 , nhưng MySQL thì không.

Lưu ý 2 :Trong MySQL, "ký tự" và "đối chiếu" không giống nhau, hãy xem Sự khác biệt giữa Mã hóa và đối chiếu? . Mặc dù vậy, cả hai đều phải được đặt thành utf-8; nói chung đối chiếu phải là utf8_general_ci hoặc utf8_unicode_ci , xem UTF-8:Chung? Thùng rác? Unicode? .

Lưu ý 3 :Nếu bạn đang sử dụng biểu tượng cảm xúc, MySQL cần được chỉ định bằng utf8mb4 bộ ký tự thay vì utf8 tiêu chuẩn , cả trong cơ sở dữ liệu và kết nối. HTML và PHP sẽ chỉ có UTF-8 .

Đặt UTF-8 với mysql_ và PDO

  • PDO:Điều này được thực hiện trong DSN của đối tượng của bạn. Lưu ý charset thuộc tính,

    $pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
    
  • mysql_ :Điều này được thực hiện rất giống với mysqli_* , nhưng nó không lấy đối tượng kết nối làm đối số đầu tiên.

    mysql_set_charset('utf8');
    


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Tạo bảng với các khóa ngoại cho errno:150

  2. MySQL lưu trữ thủ tục so với chức năng, tôi sẽ sử dụng cái nào khi nào?

  3. 5 công cụ giám sát MySQL hàng đầu

  4. MySQL cấp tất cả các đặc quyền cho cơ sở dữ liệu ngoại trừ một bảng

  5. Độ dài tối đa của dữ liệu tôi có thể đặt trong cột BLOB trong MySQL là bao nhiêu?