Khắc phục lỗi MySQL ERROR 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'

beginner🗄️ MySQL2026-07-26| Bạn có thể sẽ gặp phải rào cản này khi chuyển cơ sở dữ liệu từ máy chủ MySQL 8.0 hiện đại sang môi trường cũ hơn như MySQL 5.7 hoặc MariaDB 10.3. Đây là một vấn đề gây đau đầu thường xuyên trong quá trình di chuyển từ môi trường phát triển cục bộ (thường chạy MySQL phiên bản mới nhất) sang các nhà cung cấp shared hosting vẫn đang sử dụng các phiên bản cũ.

Error Message

ERROR 1273 (HY000): Unknown collation: 'utf8mb4_0900_ai_ci'
#mysql#di-chuyen-co-so-du-lieu#loi-sql#mariadb

Cách xử lý nhanh: Tìm kiếm và Thay thế

Cách khắc phục hiệu quả nhất là thay thế các chuỗi collation không tương thích trong tệp .sql của bạn bằng một phiên bản mà máy chủ cũ có thể thực sự nhận diện.

  • Mở tệp SQL dump của bạn bằng trình soạn thảo mã nguồn hoặc công cụ dòng lệnh.
  • Tìm kiếm tất cả các phiên bản của utf8mb4_0900_ai_ci và thay thế chúng bằng utf8mb4_unicode_ci.
  • Tìm utf8mb4_0900_as_ci và cũng thay thế chúng bằng utf8mb4_unicode_ci.
  • Lưu tệp và bắt đầu lại quá trình nhập (import) của bạn.

Tại sao lỗi này xảy ra?

Với việc phát hành phiên bản 8.0, MySQL đã cập nhật bộ ký tự mặc định thành utf8mb4 và collation mặc định thành utf8mb4_0900_ai_ci. Số "0900" đề cập đến Thuật toán Đối chiếu Unicode (UCA) 9.0.0. Thành phần "ai" cho biết việc sắp xếp không phân biệt dấu (accent-insensitive).

Các phiên bản cũ như MySQL 5.7 được xây dựng nhiều năm trước khi các tiêu chuẩn này tồn tại. Chúng đơn giản là không có các tệp thư viện để hiểu các chỉ dẫn "0900". Khi tệp xuất của bạn yêu cầu một máy chủ cũ tạo bảng bằng các quy tắc mới này, máy chủ sẽ dừng lại và báo lỗi Error 1273.

Ba cách để khắc phục

Cách 1: Sử dụng dòng lệnh (Tốt nhất cho các tệp lớn)

Việc cố gắng mở một bản SQL dump dung lượng 2GB trong trình soạn thảo văn bản thông thường có khả năng sẽ làm máy tính của bạn bị treo. Thay vào đó, hãy sử dụng sed. Nó xử lý tệp theo từng dòng mà không cần tải toàn bộ nội dung vào bộ nhớ.

# Thay thế collation 0900 bằng biến thể unicode tương thích
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' backup.sql

# Đồng thời xử lý biến thể phân biệt dấu nếu có
sed -i 's/utf8mb4_0900_as_ci/utf8mb4_unicode_ci/g' backup.sql

Lưu ý: Nếu bạn đang sử dụng macOS, cú pháp sẽ hơi khác một chút: sed -i '' 's/.../.../g' backup.sql.

Cách 2: Sử dụng VS Code hoặc Notepad++

Nếu tệp của bạn nhỏ—ví dụ dưới 50MB—thì một trình soạn thảo trực quan thường sẽ dễ dàng hơn.

  • Mở tệp .sql trong VS Code hoặc Notepad++.
  • Nhấn Ctrl + H (hoặc Cmd + Option + F trên Mac) để mở công cụ Thay thế (Replace).
  • Tìm: utf8mb4_0900_ai_ci
  • Thay thế bằng: utf8mb4_unicode_ci
  • Nhấp vào Replace All và lưu tệp.

Cách 3: Chủ động cấu hình khi xuất dữ liệu

Nếu bạn vẫn có thể truy cập cơ sở dữ liệu nguồn, bạn có thể thử xuất nó với các cài đặt tương thích tốt hơn. Trong phpMyAdmin, hãy chuyển đến tab "Export" và chọn "Custom". Dưới mục "Format-specific options", hãy tìm menu thả xuống có nhãn "Database system or older MySQL server to maximize output compatibility with". Chọn MYSQL40 là một mẹo phổ biến, mặc dù việc thay thế chuỗi thủ công vẫn là phương pháp đáng tin cậy nhất khi di chuyển sang 5.7.

Kiểm tra kết quả

Sau khi sửa đổi tệp, hãy chạy lại lệnh nhập của bạn:

mysql -u username -p database_name < backup.sql

Sau khi hoàn tất, hãy đăng nhập vào MySQL console để xác minh các bảng. Chạy lệnh SHOW TABLE STATUS; và kiểm tra cột Collation. Bây giờ nó sẽ liệt kê utf8mb4_unicode_ci. Cuối cùng, hãy duyệt trang web của bạn để đảm bảo rằng các emoji và ký tự đặc biệt như é hoặc ñ đang hiển thị chính xác.

Lưu ý về các phiên bản cũ hơn

Nếu bạn đang di chuyển sang một máy chủ rất cũ (trước MySQL 5.5.3), ngay cả utf8mb4 cũng sẽ không hoạt động. Trong những trường hợp hiếm hoi đó, bạn phải thay thế utf8mb4 bằng utf8utf8mb4_unicode_ci bằng utf8_unicode_ci. Tuy nhiên, đối với hầu hết các môi trường hosting hiện đại, utf8mb4_unicode_ci là lựa chọn an toàn và tương thích nhất.

Related Error Notes