Bài viết Câu hỏi About RongvangIT
profile Pic
0
0

Đăng ngày:

 

Sửa ngày:

56 Lượt xem

Cẩn thận khi lưu trữ Emoji vào MySQL

EmojiMySQL

Chào buổi tối cả nhà.

Hôm nay, mình muốn giới thiệu về mối quan hệ giữa Emoji (biểu tượng cảm xúc) và MySQL, điều mà chúng ta thường ít để ý .

Xảy ra bug nếu lưu trữ Emoji vào MySQL như thông thường

Nhiều sách tham khảo và trang web đã đề cập đến quy tắc là khi thực hiện “CREATE DATABASE” trong MySQL, bạn nên chọn bảng mã là “utf-8 (utf8_general_ci)”. Thường thì mình cũng thường chọn “utf-8 (utf8_general_ci)” khi tạo cơ sở dữ liệu.

Tuy nhiên, khi chuỗi ký tự mà chúng ta xử lý có khả năng chứa “Emoji”, nếu bạn lưu trữ chúng vào cơ sở dữ liệu và bảng đã tạo với “utf-8 (utf8_general_ci)”, bạn sẽ gặp bug lớn đấy.

Nội dung bug

Nếu bạn lưu trữ “Emoji” vào bảng đã tạo với “utf-8 (utf8_general_ci)”, điều gì sẽ xảy ra?

Đáp án: “Chỉ có chuỗi ký tự đến trước Emoji mới được lưu trữ!!”

Nghĩa là, bạn sẽ không thể lưu trữ toàn bộ chuỗi ký tự.

Bảng đã tạo với “utf-8 (utf8_general_ci)” không tạo ra lỗi khi bạn “INSERT / UPDATE” Emoji vào nó, vì vậy bạn sẽ không nhận ra bug này cho đến khi bạn kiểm tra dữ liệu thực tế.

Nguyên nhân của lỗi

Nguyên nhân của vấn đề này nằm ở bảng mã ký tự của “Emoji”.

Thường, chuỗi ký tự mà chúng ta xử lý là “chuỗi 1-2 byte”, nên có thể xử lý dễ dàng bằng “utf-8 (utf8_general_ci)”.

Tuy nhiên, “Emoji” là “chuỗi 4 byte”, nằm ngoài khả năng xử lý của “utf-8 (utf8_general_ci)”, dẫn đến việc không thể đăng ký chúng.

Phương pháp giải quyết

Phương pháp giải quyết là “sử dụng bảng mã có thể xử lý chuỗi 4 byte”.

Ở đây, chúng ta sử dụng bảng mã “utf-8mb4” có thể xử lý “chuỗi 4 byte”.

Cần chú ý rằng, phiên bản MySQL có thể xử lý bảng mã này là “5.5 trở lên”.

Cập nhật cơ sở dữ liệu thành “utf8mb4”

Nếu bạn muốn cập nhật cơ sở dữ liệu đã tạo thành “utf8mb4”, bạn có thể chạy câu lệnh SQL sau:

ALTER DATABASE tên_cơ_s_d_liu DEFAULT CHARACTER SET utf8mb4;

Tạo mới cơ sở dữ liệu với “utf8mb4”

Nếu bạn tạo mới cơ sở dữ liệu, bạn có thể chạy câu lệnh SQL sau:

CREATE DATABASE tên_cơ_s_d_liu DEFAULT CHARACTER SET utf8mb4;

Cập nhật bảng thành “utf8mb4”

Nếu bạn muốn cập nhật bảng đã tạo thành “utf8mb4”, bạn có thể chạy câu lệnh SQL sau:

ALTER TABLE tên_bng DEFAULT CHARACTER SET utf8mb4;

Tạo mới bảng với “utf8mb4”

Nếu bạn tạo mới bảng, bạn có thể chạy câu lệnh SQL sau:

CREATE TABLE tên_bng(cài_đặt_ct) DEFAULT CHARACTER SET utf8mb4;

Cập nhật cột thành “utf8mb4”

Nếu bạn muốn cập nhật cột đã tạo thành “utf8mb4”, bạn có thể chạy câu lệnh SQL sau:

ALTER TABLE tên_bng MODIFY tên_ct kiu CHARACTER SET utf8mb4 [...];

Chú ý đến việc cập nhật mã ký tự khi thực hiện

Dù bạn có thay đổi mã ký tự của các cơ sở dữ liệu và bảng trong MySQL, nếu bạn không thay đổi mã ký tự của chương trình thực thi, điều này sẽ không có ý nghĩa.

Hãy chắc chắn rằng bạn sử dụng PDO hoặc một cách nào đó để thực hiện “mysql:dbname=tên_cơ_sở_dữ_liệu;host=localhost;charset=utf8mb4” và thực hiện các thao tác trên MySQL.

Lưu ý về vấn đề hiện tượng lỗi khi chuyển đổi mã ký tự

Thường, khi bạn thay đổi mã ký tự giữa chừng, có khả năng chuỗi đã đăng ký sẽ trở nên phức tạp, nhưng với “utf8mb4”, vì nó là mở rộng của “utf8”, về cơ bản không xảy ra hiện tượng lỗi khi chuyển đổi mã ký tự.

Đôi khi có rủi ro về vấn đề “vấn đề HaHaPaPa” và “vấn đề Sushi=Beer”, nhưng về vấn đề này, mình muốn giới thiệu ở một dịp khác.

Tóm tắt

Gần đây, Twitter cũng có thể xử lý Emoji như trên iPhone, và thói quen sử dụng Emoji khác biệt từ thời kì điện thoại cơ bản đã trở nên phổ biến.

Với việc nâng cao phiên bản MySQL, chúng ta có thể cải thiện khả năng xử lý vấn đề như vậy và tăng cường sức mạnh phát triển của mình.

Bình luận

Bài viết chưa có bình luận. Hãy trở thành người bình luận đầu tiên!
Sign up for free and join this conversation.
Sign Up
If you already have a RongvangIT account Login
Danh sách thư mục
Bắt đầu ngay với RồngVàngIT - nền tảng chia sẻ kiến thức lập trình tuyệt vời cho kỹ sư Việt Nam!

Hãy đăng nhập để sử dụng hàng loạt các chức năng tuyệt vời của RồngVàngIT !

  1. 1. Bạn sẽ nhận được các bài viết phù hợp bằng chức năng theo dõi tag và người dùng.
  2. 2. Bạn có thể đọc lại các thông tin hữu ích bằng chức năng lưu trữ nội dung.
  3. 3. Chia sẻ kiến thức, đặt câu hỏi và ghi lại quá trình trưởng thành của mình cùng RồngVàngIT !
Tạo tài khoản Đăng nhập
profile Pic