WordPress và file xuất CSDL: á và ệ thay vì á và ệ

Sau khi chuyển host, nâng cấp hoặc xuất cơ sở dữ liệu, bài viết bỗng hiện Tiếng Việt thay vì Tiếng Việt? Dữ liệu hầu như vẫn còn nguyên, chỉ là bị đọc sai bảng mã. Mojibuster sửa file xuất ra, sau đó bạn khắc phục nguyên nhân trong cơ sở dữ liệu.

Hỗ trợ văn bản và các file sau:

  • CSV
  • TXT
  • JSON
  • XML
  • SRT
  • VTT
  • SMI
  • TSV
  • MD
  • HTML
  • SQL
  • LOG

Ví dụ file xuất từ Excel, bản sao cơ sở dữ liệu, phụ đề hoặc mã nguồn trang web.

Sửa lỗi

  1. Kéo file vào hoặc dán văn bản
  2. Tự động sửa
  3. Sao chép hoặc tải về
hoặc kéo file vào đây
  • Không tải lên. File được sửa ngay trong trình duyệt và không rời khỏi thiết bị của bạn.

  • Máy chủ tại EU. Mojibuster chạy trên máy chủ ở Phần Lan (EU), vì vậy Quy định chung về bảo vệ dữ liệu (GDPR) được áp dụng. Toàn văn GDPR (EUR-Lex, tiếng Anh)

Vấn đề trông như thế nào

Một dòng trong file SQL sau khi chuyển máy chủ

Trước

INSERT INTO wp_posts (post_title) VALUES ('Tiếng Việt – Hà Nội');

Sau

INSERT INTO wp_posts (post_title) VALUES ('Tiếng Việt – Hà Nội');

Nguyên nhân từ đâu

WordPress lưu văn bản dạng UTF-8. Nhưng nhiều website cũ tạo bảng bằng latin1 hoặc kết nối bằng latin1. Miễn là việc ghi và đọc cùng sai như nhau thì không ai nhận ra. Sau khi chuyển sang máy chủ mới, xuất bằng phpMyAdmin hoặc đổi bảng mã kết nối, mọi chữ có dấu đồng loạt thành nhiều ký tự lạ.

  • DB_CHARSET trong wp-config.php là latin1 hoặc không khớp với các bảng.
  • File sao lưu được xuất bằng latin1 nhưng nhập bằng utf8mb4, hoặc ngược lại.
  • Một plugin hay script nhập liệu chuyển mã văn bản vốn đã lỗi thêm một lần nữa. Khi đó xuất hiện lỗi font hai lần.

Sửa file xuất

  1. Sao lưu cơ sở dữ liệu trước khi thay đổi bất cứ thứ gì.
  2. Xuất các bảng bị ảnh hưởng thành file .sql, ví dụ bằng phpMyAdmin hoặc mysqldump --default-character-set=utf8mb4.
  3. Kéo thả file vào ô phía trên. Mojibuster chỉ sửa các chỗ lỗi và hiển thị mọi thay đổi.
  4. Tải file đã sửa về và nhập bằng utf8mb4 vào một cơ sở dữ liệu thử nghiệm mới.
  5. Kiểm tra website. Nếu mọi thứ đúng thì mới nhập vào cơ sở dữ liệu chính.

File sao lưu không bị tải lên. Điều này quan trọng vì nó thường chứa tài khoản người dùng, địa chỉ email và bình luận.

Cẩn thận với dữ liệu tuần tự hóa

WordPress lưu một số thiết lập trong wp_options và wp_postmeta dưới dạng giá trị PHP tuần tự hóa như s:14:"Tiếng Việt";. Con số là độ dài tính bằng byte, không phải số ký tự. Khi ệ trở lại thành ệ, độ dài không còn khớp và WordPress sẽ bỏ giá trị đó. Vì vậy hãy sửa các bảng nội dung như wp_posts, wp_comments, wp_terms trước. Với phần tùy chọn, wp search-replace của WP-CLI phù hợp hơn vì nó cập nhật cả độ dài.

Khắc phục nguyên nhân trong MySQL

  • Chuyển bảng và kết nối sang utf8mb4, đồng thời đặt define('DB_CHARSET', 'utf8mb4'); trong wp-config.php.
  • Nếu cột latin1 đang chứa byte UTF-8 thì đừng chuyển đổi trực tiếp, vì như vậy sẽ bị mã hóa thêm lần nữa. Cách thường dùng là đi qua kiểu nhị phân: trước hết MODIFY … LONGBLOB, sau đó MODIFY … LONGTEXT CHARACTER SET utf8mb4.
  • Luôn thử mọi thay đổi trên bản sao của cơ sở dữ liệu trước.

Câu hỏi thường gặp

Tôi có sửa được cả cơ sở dữ liệu WordPress cùng lúc không?

Có, kể cả file SQL lớn. Tuy nhiên hãy lưu ý dữ liệu tuần tự hóa trong wp_options và wp_postmeta, WP-CLI xử lý phần này tốt hơn.

Ký tự đúng trong file có bị thay đổi không?

Không. Mojibuster chỉ sửa những chuỗi rõ ràng bị lỗi. Văn bản đúng được giữ nguyên.

utf8 và utf8mb4 khác nhau thế nào?

utf8 của MySQL chỉ lưu ký tự tối đa ba byte nên emoji bị mất. utf8mb4 mới là UTF-8 đầy đủ và là lựa chọn đúng cho WordPress.

Có dùng được cho hệ thống khác ngoài WordPress không?

Có. Joomla, Drupal, Magento hoặc ứng dụng tự xây trên MySQL, MariaDB đều gặp cùng vấn đề và cùng cách sửa.

Hướng dẫn khác