Character Sets và Collations trong MySQL/MariaDB hỗ trợ tiếng Việt

Khi làm việc với MySQL hoặc các biến thể như Percona Server hoặc MariaDB, bạn thường sẽ gặp các khái niệm về bộ ký tự (character set) và đối chiếu (collation), vốn rất quan trọng để quản lý đúng cách việc lưu trữ và xử lý dữ liệu văn bản trong cơ sở dữ liệu. Tuy nhiên, đối với nhiều nhà phát triển mới làm quen với các hệ quản trị cơ sở dữ liệu này, những khái niệm này có thể phức tạp hoặc khó hiểu.

Trong bài viết này, chúng ta sẽ khám phá chi tiết bộ ký tự và đối chiếu trong MySQL và MariaDB là gì, tại sao chúng quan trọng và chúng ảnh hưởng thế nào đến việc lưu trữ và quản lý dữ liệu. Chúng ta sẽ đề cập đến các bộ ký tự chính như UTF8, UTF8MB3, UTF8MB4, nói về tầm quan trọng của đối chiếu bao gồm utf8mb4_general_ci, utf8mb4_unicode_ci, và utf8mb4_unicode_520_ci và hiểu được cách các cài đặt này có thể ảnh hưởng đến tốc độ truy vấn. Đặc biệt, chúng ta sẽ tìm hiểu cách các cài đặt này ảnh hưởng đến việc hỗ trợ tiếng Việt và các ký tự đặc biệt trong tiếng Việt.

Bộ ký tự là gì?

Một bộ ký tự (character set) là một tập hợp các ký hiệu và biểu diễn nhị phân của chúng. Mọi cơ sở dữ liệu quan hệ như MySQL hoặc MariaDB đều sử dụng bộ ký tự để quản lý cách mã hóa và lưu trữ các ký tự trong các trường của bảng.

Ví dụ về Bộ ký tự

Có một số bộ ký tự được sử dụng trong cơ sở dữ liệu, một số trong những bộ phổ biến nhất bao gồm:

  • Latin1: bộ ký tự một byte biểu diễn mã hóa ISO-8859-1 (phổ biến trong các ngôn ngữ Tây Âu).
  • utf8: Bộ ký tự mã hóa dữ liệu bằng cách sử dụng mã hóa UTF-8. Mỗi ký tự có thể chiếm từ 1 đến 3 byte. Tuy nhiên, trong MySQL, tên “utf8” hơi gây hiểu lầm vì nó chỉ biểu diễn các ký tự lên đến 3 byte (chi tiết hơn ở phần sau).
  • utf8mb4: Một biến thể của UTF-8 hỗ trợ đầy đủ tất cả các ký tự Unicode, bao gồm emoji và các ký hiệu yêu cầu tối đa 4 byte.

UTF8 so với UTF8MB4: Điểm khác biệt là gì?

Một trong những điểm quan trọng nhất cần hiểu là sự khác biệt giữa utf8 và utf8mb4 trong MySQL và MariaDB.

  • utf8: là bộ ký tự hỗ trợ các ký tự UTF-8, nhưng chỉ lên đến 3 byte cho mỗi ký tự. Điều này có nghĩa là nó chỉ có thể biểu diễn một tập con của các ký tự Unicode (khoảng 1.112.064 ký tự), nhưng không hỗ trợ các ký tự như nhiều emoji và một số ký hiệu châu Á yêu cầu 4 byte.
  • utf8mb4: là triển khai đầy đủ của mã hóa UTF-8 trong MySQL và MariaDB. utf8mb4 hỗ trợ tất cả các ký tự Unicode, bao gồm cả những ký tự yêu cầu 4 byte. Đây là bộ ký tự mà bạn nên sử dụng nếu cơ sở dữ liệu cần xử lý chính xác emoji hoặc các ký tự khác yêu cầu nhiều hơn 3 byte.

Ví dụ thực tế: Nếu bạn cố gắng lưu một emoji (ví dụ: 😊) trong một cột sử dụng bộ ký tự utf8, bạn sẽ gặp lỗi hoặc dữ liệu sẽ bị cắt ngắn, vì ký tự đó yêu cầu 4 byte, trong khi utf8 chỉ hỗ trợ tối đa 3 byte. Sử dụng utf8mb4, ngược lại, emoji sẽ được lưu chính xác.

Đối với tiếng Việt, các ký tự như â, ă, ê, ô, ơ, ư và các dấu thanh ́, ̀, ̉, ̃, ̣ thường được biểu diễn trong khoảng 1-3 byte trong UTF-8, nhưng để đảm bảo tương thích tốt nhất và hỗ trợ đầy đủ các ký tự đặc biệt, biểu tượng hiện đại và emoji khi kết hợp với văn bản tiếng Việt, utf8mb4 vẫn là lựa chọn tốt nhất.

Sử dụng UTF8MB3

Đôi khi bạn có thể thấy thuật ngữ utf8mb3, đây là tên thay thế cho bộ ký tự utf8 trong MySQL. Tên này được giới thiệu để làm rõ hơn rằng utf8 trong MySQL chỉ hỗ trợ các ký tự lên đến 3 byte, trái ngược với utf8mb4 hỗ trợ toàn bộ bộ ký tự Unicode, bao gồm cả ký tự 4 byte như emoji hoặc một số ký tự châu Á phức tạp hơn. Vì vậy, về cơ bản, utf8mb3 và utf8 là tương đương, nhưng việc sử dụng utf8mb3 nhằm nhấn mạnh vào hạn chế vốn có của MySQL trong việc chỉ hỗ trợ một tập con của các ký tự Unicode theo quy ước đặt tên cũ utf8.

Trong những năm gần đây, bối cảnh công nghệ ngày càng hướng tới hỗ trợ đầy đủ cho các ký tự Unicode, bao gồm cả ký tự 4 byte. Vì lý do này, thế giới đang hướng tới việc áp dụng phổ biến utf8mb4, cả vì lý do tương thích với các tiêu chuẩn mới và để đảm bảo quản lý ký tự đầy đủ hơn.

Sự chuyển đổi sang utf8mb4

Trong một số cấu hình, đặc biệt là trong các phiên bản mới hơn của MariaDB, có thể quan sát thấy sự “chuyển đổi” trong việc quản lý bộ ký tự. Theo truyền thống, utf8 (hoặc utf8mb3) được coi là đủ cho hầu hết các ứng dụng không cần xử lý các ký tự phức tạp. Tuy nhiên, với nhu cầu ngày càng tăng để xử lý nội dung đa ngôn ngữ, emoji và các ký tự đặc biệt khác, bộ ký tự utf8mb4 đã bắt đầu được áp dụng như một chuẩn mực mới.

Một ví dụ về sự thay đổi này có thể được quan sát trong hành vi mặc định của cơ sở dữ liệu. Trong khi trước đây bộ ký tự utf8 được sử dụng rộng rãi, nhiều cấu hình mặc định của các phiên bản mới của MySQL và MariaDB đang chuyển sang utf8mb4 làm tùy chọn mặc định để đảm bảo hỗ trợ phông chữ rộng hơn và hiện đại hơn.

Trong một số bản phát hành gần đây, có thể xảy ra trường hợp, mà không cần cấu hình rõ ràng, một cơ sở dữ liệu vốn sử dụng utf8 để lưu trữ chuỗi, có thể chuyển sang utf8mb4 một cách ngầm định. Điều này có thể dẫn đến những thay đổi không mong muốn trong quản lý dữ liệu, chẳng hạn như tăng kích thước lưu trữ cho các cột VARCHAR hoặc TEXT, và có thể ảnh hưởng đến liên quan đến các hoạt động lập chỉ mục và so sánh trên các ký tự phức tạp.

Tác động của cấu hình MySQL và MariaDB

Để quản lý bước này một cách chính xác, điều cần thiết là phải kiểm tra và cấu hình cẩn thận các cài đặt cơ sở dữ liệu của bạn, cả ở cấp máy chủ và cho một bảng hoặc cột riêng lẻ. Trong MySQL và MariaDB, nhiều cài đặt liên quan đến bộ ký tự và đối chiếu có thể được xác định trong các tệp cấu hình chính, chẳng hạn như my.cnf trong MySQL hoặc server.cnf trong MariaDB.

Đối chiếu là gì?

Đối chiếu (Collation) là một tập hợp các quy tắc xác định cách so sánh và sắp xếp ký tự trong cơ sở dữ liệu. Mỗi bộ ký tự có một hoặc nhiều đối chiếu liên kết, chỉ định cách so sánh các ký tự cho các hoạt động như ORDER BY, GROUP BY hoặc để thực hiện so sánh bình đẳng.

Các đối chiếu chính trong MySQL

Các đối chiếu có tên tuân theo một quy ước cụ thể. Ví dụ, utf8mb4_general_ci được chia thành ba phần:

  • utf8mb4: cho biết bộ ký tự mà đối chiếu thuộc về.
  • general: cho biết loại quy tắc so sánh.
  • ci: viết tắt của case insensitive, nghĩa là đối chiếu không phân biệt chữ hoa chữ thường.

Dưới đây là một số đối chiếu chính được sử dụng trong MySQL và MariaDB:

  • utf8mb4_general_ci: Đây là một trong những đối chiếu mặc định cho utf8mb4 và không phân biệt chữ hoa chữ thường. Nó sử dụng các quy tắc đối chiếu đơn giản hóa, chung chung, điều này làm cho nó đặc biệt hiệu quả về tốc độ cho các hoạt động như sắp xếp và so sánh chuỗi. Tuy nhiên, do tính chất đơn giản hóa, nó kém nghiêm ngặt và chính xác hơn trong việc xử lý một số phức tạp ngôn ngữ so với tiêu chuẩn Unicode. Đối với các ứng dụng mà tốc độ là quan trọng và độ chính xác ngôn ngữ không phải là mối quan tâm, nó thường là lựa chọn ưa thích.
  • utf8mb4_unicode_ci: Đối chiếu này tuân thủ nghiêm ngặt các quy tắc tiêu chuẩn Unicode cho việc so sánh ký tự. Nó chính xác hơn utf8mb4_general_ci khi làm việc với các ngôn ngữ khác nhau, dấu, ký hiệu phức tạp và ký tự đặc biệt. Tuy nhiên, độ chính xác của nó đi kèm với chi phí về hiệu suất: nó có thể chậm hơn một chút trong các truy vấn, đặc biệt là trên các tập dữ liệu lớn, do các quy tắc đối chiếu chi tiết hơn. Nó được khuyến nghị cho các ứng dụng yêu cầu độ chính xác ngôn ngữ cao.
  • utf8mb4_unicode_520_ci: Đây là một biến thể cập nhật của utf8mb4_unicode_ci triển khai các quy tắc của tiêu chuẩn Unicode 5.2. Ngoài việc giữ lại các tính năng của phiên bản trước, nó hỗ trợ các ký tự và ký hiệu mới được giới thiệu với phiên bản này của giao thức Unicode, làm cho nó trở thành lựa chọn phù hợp để xử lý các ký tự mới hoặc đặc biệt. Một lần nữa, độ chính xác đi kèm với chi phí của một đợt truy vấn có thể chậm hơn so với đối chiếu ít chính xác hơn.

Đối với tiếng Việt, việc chọn đối chiếu đúng cũng rất quan trọng để đảm bảo sắp xếp và so sánh văn bản một cách chính xác. Các đối chiếu Unicode như utf8mb4_unicode_ci thường xử lý tốt các ký tự tiếng Việt và dấu thanh, trong khi utf8mb4_general_ci có thể không xử lý một số trường hợp đặc biệt một cách chính xác khi so sánh hoặc sắp xếp.

Sự khác biệt giữa các đối chiếu

utf8mb4_general_ci và utf8mb4_unicode_ci

utf8mb4_general_ci nhanh hơn vì nó áp dụng các đối chiếu đơn giản hơn, đặc biệt là đối với các ngôn ngữ châu Âu. Tuy nhiên, nó không xử lý tốt tất cả các phức tạp ngôn ngữ. Ví dụ, nó không phân biệt chính xác một số biến thể ký tự trong các ngôn ngữ không phải châu Âu, chẳng hạn như các ký tự liên kết hoặc một số dấu trong các ngôn ngữ châu Á.

Mặt khác, utf8mb4_unicode_ci tuân thủ nghiêm ngặt các quy tắc Unicode, xử lý chính xác các ký tự đặc biệt, dấu và ký hiệu, làm cho nó phù hợp nhất với các tình huống mà độ chính xác ngôn ngữ là thiết yếu.

Tác động đến hiệu suất

Việc sử dụng đối chiếu có thể có tác động đáng kể đến hiệu suất truy vấn. Đối chiếu phức tạp hơn, chẳng hạn như utf8mb4_unicode_ci hoặc utf8mb4_unicode_520_ci, có thể mất nhiều thời gian hơn để thực hiện so sánh và sắp xếp, vì chúng phải tuân theo các quy tắc chi tiết hơn.

Ví dụ, nếu bạn có một bảng với hàng triệu hàng và bạn đang thực hiện ORDER BY trên một cột với đối chiếu utf8mb4_unicode_ci, có thể mất nhiều thời gian hơn so với một bảng sử dụng utf8mb4_general_ci. Điều này là do đối chiếu Unicode phải xử lý chính xác các ký tự phức tạp, dấu và các ký hiệu đặc biệt khác, trong khi utf8mb4_general_ci áp dụng các quy tắc so sánh đơn giản hơn.

Biểu đồ cho thấy so sánh hiệu suất giữa các đối chiếu khác nhau trong MySQL 5.7, được đo bằng thông lượng (tps) so với số lượng luồng được sử dụng (4, 24, 64, 128). Các đối chiếu so sánh là:

  • utf8mb4_general_ci (mặc định) (màu xanh dương)
  • utf8mb4_bin (màu đỏ)
  • utf8mb4_unicode_ci (màu vàng)
  • utf8mb4_unicode_520_ci (màu xanh lá)

Nhận xét:

  • utf8mb4_bin (đỏ) có thông lượng cao nhất với tất cả số lượng luồng, thể hiện hiệu suất tốt nhất.
  • utf8mb4_general_ci (xanh dương), đối chiếu mặc định, là nhanh thứ hai, với hiệu suất vẫn ổn định và rất gần với utf8mb4_bin với 128 luồng.
  • utf8mb4_unicode_ci (vàng) có hiệu suất thấp hơn utf8mb4_bin và utf8mb4_general_ci, với thông lượng thấp hơn rõ rệt đặc biệt là bắt đầu từ 24 luồng.
  • utf8mb4_unicode_520_ci (xanh lá) là đối chiếu có hiệu suất kém nhất, đặc biệt là khi số lượng luồng tăng lên, xác nhận sự sụt giảm đáng kể về thông lượng.

Nếu bạn sử dụng đối chiếu bao gồm utf8mb4_unicode_ci hoặc utf8mb4_unicode_520_ci, sẽ có tác động đáng kể đến hiệu suất, đặc biệt là trong tình huống số lượng luồng cao, so với việc sử dụng đối chiếu nhẹ hơn như utf8mb4_general_ci hoặc utf8mb4_bin.

Các trường hợp sử dụng thực tế

Nếu bạn đang phát triển một ứng dụng cần hỗ trợ các ngôn ngữ Tây Âu và bạn không quá quan tâm đến độ chính xác của các quy tắc đối chiếu cho các ngôn ngữ khác, utf8mb4_general_ci có thể là một lựa chọn hợp lý. Nếu, tuy nhiên, cơ sở dữ liệu của bạn cần hỗ trợ nhiều ngôn ngữ, bao gồm tiếng Việt, và bạn cần đảm bảo rằng các so sánh ký tự được thực hiện theo quy tắc tiêu chuẩn Unicode, thì utf8mb4_unicode_ci hoặc utf8mb4_unicode_520_ci là những lựa chọn tốt hơn.

Chọn bộ ký tự và đối chiếu phù hợp

Việc lựa chọn bộ ký tự và đối chiếu phụ thuộc rất nhiều vào yêu cầu ứng dụng của bạn và loại dữ liệu bạn dự định xử lý trong cơ sở dữ liệu.

Khi nào sử dụng UTF8MB4

Nói chung, nếu bạn đang làm việc trên một dự án mới, bạn nên sử dụng utf8mb4 làm phông chữ mặc định. Ngay cả khi bạn không có kế hoạch xử lý emoji hoặc ký hiệu Unicode 4 byte ngay bây giờ, việc sử dụng utf8mb4 cung cấp cho bạn sự linh hoạt để xử lý bất kỳ ký tự Unicode nào trong tương lai. Không có bất lợi đáng kể nào khi sử dụng utf8mb4 so với utf8, ngoại trừ việc tăng nhẹ không gian lưu trữ cho các ký tự yêu cầu nhiều byte hơn.

Đối với tiếng Việt, sử dụng utf8mb4 và một đối chiếu Unicode như utf8mb4_unicode_ci đảm bảo tốt nhất rằng tất cả các ký tự tiếng Việt, bao gồm các dấu thanh và ký tự đặc biệt, sẽ được lưu trữ, hiển thị và so sánh chính xác.

Ví dụ triển khai thực tế:

CREATE DATABASE testdb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

Trong ví dụ này, bạn đang tạo một cơ sở dữ liệu có tên testdb với bộ ký tự utf8mb4 và đối chiếu utf8mb4_unicode_ci. Cấu hình này đảm bảo rằng cơ sở dữ liệu hỗ trợ tất cả các ký tự Unicode, bao gồm emoji và các ký tự tiếng Việt, và nó tuân theo các quy tắc Unicode tiêu chuẩn để so sánh và sắp xếp ký tự.

Đối chiếu và hiệu suất

Như chúng ta đã đề cập, việc sử dụng đối chiếu phức tạp hơn có thể ảnh hưởng đến hiệu suất. Do đó, nếu bạn đang phát triển một ứng dụng mà tốc độ truy vấn là quan trọng và bạn không quá quan tâm đến độ chính xác ngôn ngữ, bạn có thể muốn chọn một đối chiếu đơn giản hơn như utf8mb4_general_ci.

Mặt khác, nếu ứng dụng của bạn phải xử lý nhiều ngôn ngữ, đặc biệt là tiếng Việt với các dấu thanh và ký tự đặc biệt, và yêu cầu độ chính xác ngôn ngữ nghiêm ngặt, bạn nên chọn một đối chiếu phức tạp hơn như utf8mb4_unicode_ci.

Tác động của đối chiếu đến chỉ mục và tìm kiếm

Một lĩnh vực khác mà đối chiếu có thể ảnh hưởng là việc tạo chỉ mục. Khi bạn tạo một chỉ mục trên một cột sử dụng đối chiếu, các quy tắc của đối chiếu xác định cách chỉ mục được sắp xếp. Điều này có thể ảnh hưởng đến hiệu suất của các tìm kiếm cơ sở dữ liệu như chúng ta có thể thấy trong ví dụ dưới đây lấy từ blog của Percona nơi nói về hiệu suất đối chiếu.

Ví dụ, một chỉ mục được tạo trên một cột với utf8mb4_general_ci có thể hiệu quả hơn một chỉ mục trên một cột với utf8mb4_unicode_ci, vì các quy tắc so sánh của đối chiếu chung chung đơn giản hơn.

CREATE INDEX idx_name ON users (name COLLATE utf8mb4_general_ci);

Trong ví dụ này, chỉ mục trên cột name sử dụng đối chiếu utf8mb4_general_ci, có thể cung cấp hiệu suất tìm kiếm tốt hơn so với một chỉ mục sử dụng utf8mb4_unicode_ci.

Kết luận

Bộ ký tự và đối chiếu là các thành phần quan trọng để quản lý đúng dữ liệu văn bản trong MySQL và MariaDB. Chọn bộ ký tự đúng (tốt nhất là utf8mb4 cho các dự án mới) và đối chiếu phù hợp có thể có tác động đáng kể đến khả năng xử lý các ký tự phức tạp của cơ sở dữ liệu, chẳng hạn như emoji và các ký tự tiếng Việt, và đến cách thực hiện các hoạt động như sắp xếp và so sánh dữ liệu.

Tóm lại, đây là sáu lời khuyên thực tế để quản lý tốt hơn bộ ký tự và đối chiếu trong MySQL và MariaDB:

  1. Sử dụng utf8mb4 để hỗ trợ tất cả các ký tự Unicode: Đây là lựa chọn tốt nhất để đảm bảo khả năng tương thích với các ký tự phức tạp, emoji, các ký tự tiếng Việt và các ký hiệu 4 byte, làm cho cơ sở dữ liệu của bạn sẵn sàng xử lý nội dung hiện đại và đa ngôn ngữ.
  2. Nếu bạn quan tâm đến tốc độ truy vấn và không cần quy tắc Unicode chính xác, hãy chọn utf8mb4_general_ci: Đối chiếu này cung cấp hiệu suất tốt hơn về mặt tốc độ, với các quy tắc đối chiếu đơn giản hơn, và phù hợp cho các ngữ cảnh mà độ chính xác ngôn ngữ không quan trọng.
  3. Nếu độ chính xác trong quy tắc đối chiếu là quan trọng, hãy sử dụng utf8mb4_unicode_ci hoặc utf8mb4_unicode_520_ci: Những đối chiếu này lý tưởng cho các ứng dụng đa ngôn ngữ, bao gồm tiếng Việt, yêu cầu so sánh chính xác, tuân thủ Unicode. utf8mb4_unicode_520_ci cũng cung cấp hỗ trợ cho các ký tự mới hơn được giới thiệu với Unicode 5.2.
  4. Xem xét không gian lưu trữ và chỉ mục khi sử dụng utf8mb4: Vì nó chiếm nhiều byte hơn utf8, bạn có thể cần xem xét giới hạn chỉ mục và kích thước cột tăng lên. Cấu hình không chính xác có thể gây ra lỗi hoặc tăng việc sử dụng tài nguyên.
  5. Đảm bảo căn chỉnh các cài đặt của bộ ký tự và đối chiếu giữa máy chủ, cơ sở dữ liệu, bảng và khách hàng: Sự khác biệt trong cấu hình giữa các cấp độ này có thể gây ra vấn đề mã hóa và dữ liệu bị hỏng. Vui lòng thiết lập tệp cấu hình chính xác (my.cnf hoặc server.cnf) để đảm bảo tính nhất quán.
  6. Cập nhật các ứng dụng hiện có nếu chúng vẫn dựa trên utf8 (utf8mb3): Nếu ứng dụng của bạn được xây dựng trên bộ ký tự utf8 (còn gọi là utf8mb3), hãy cân nhắc kỹ việc di chuyển sang utf8mb4, đặc biệt nếu bạn có kế hoạch xử lý dữ liệu phức tạp, emoji hoặc ký hiệu đa ngôn ngữ trong tương lai.

Nhận thức về tác động của những lựa chọn này sẽ giúp bạn tối ưu hóa việc quản lý dữ liệu văn bản và đảm bảo rằng ứng dụng của bạn hoạt động chính xác và hiệu quả.

Nếu cơ sở dữ liệu hoặc của bạn không thể lưu các ký tự đặc biệt tiếng Việt, vui lòng liên hệ với chúng tôi để được tư vấn và giải quyết vấn đề.

5/5 - (26 votes)

donate Nếu bạn thấy bài viết có ích bạn có thể donate cho team hoặc chia sẻ bài viết này. Ngoài ra bạn có thể yêu cầu thêm bài viết tại đây
Đã copy
vutruso

Vũ Trụ Số chuyên cung cấp hosting cho WordPress, dịch vụ thiết kế website, quản trị website cho doanh nghiệp, dịch vụ quảng cáo Google, quảng cáo Facebook, các dịch vụ bảo mật website WordPress, tăng tốc website WordPress

Bài viết liên quan