Kiểu dữ liệu MySQL 8 UUID

Các mẹo trong tài liệu này áp dụng cho MySQL, MariaDB và Percona. Mặc dù 8. 0 chưa được đưa vào MariaDB hoặc Percona, các Hàm được lưu trữ được mô tả ở đây có chức năng tương tự

Hàm này trong MySQL được sử dụng để trả về Mã định danh duy nhất toàn cầu (UUID) được tạo theo RFC 4122, “Không gian tên URN Mã định danh duy nhất toàn cầu (UUID)”. Nó được thiết kế như một số duy nhất trên toàn cầu. Hai giá trị UUID dự kiến ​​sẽ khác biệt, ngay cả khi chúng được tạo trên hai máy chủ độc lập. Trong MySQL, giá trị UUID là số 128 bit được biểu thị dưới dạng chuỗi utf8 và định dạng theo số thập lục phân sẽ như sau

Thí dụ -

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

Ở đây, ba số đầu tiên được tạo từ các phần thấp, trung bình và cao của dấu thời gian. Như bạn có thể thấy rằng ở định dạng trên, mã chữ số vị trí thứ tư sẽ duy trì tính duy nhất theo thời gian và mã vị trí thứ năm sẽ cung cấp tính duy nhất về không gian và đó là số nút IEEE 802

cú pháp

UUID()

Tham số
Phương pháp này không có bất kỳ tham số
trả lại
Nó trả về một số Định danh duy nhất toàn cầu

Ví dụ 1
Tạo một giá trị Mã định danh duy nhất toàn cầu với sự trợ giúp của Hàm UUID

SELECT UUID() 
AS UUID_Value ;

đầu ra

UUID_VALUEfbe516f6-3e39-11eb-b897-0862660ccbd4

Ví dụ-2
Bất cứ khi nào chúng tôi sẽ sử dụng hàm UUID, chúng tôi sẽ nhận được giá trị Mã định danh duy nhất toàn cầu khác nhau. Hãy kiểm tra nó

  SELECT UUID() 
AS  
UUID_VALUE1, 
UUID() 
AS UUID_VALUE2, 
UUID() 
AS UUID_VALUE3 ;

đầu ra

UUID_VALUE1UUID_VALUE2UUID_VALUE3e762634c-3e41-11eb-b897-0862660ccbd4e7626367-3e41-11eb-b897-0862660ccbd4e7626368-3e41-11eb-b897-0862660ccbd4

Ví dụ-3
Trong ví dụ này, chúng tôi sẽ sử dụng UUID làm khóa chính trong bảng. Để minh họa, hãy tạo một bảng có tên OrderDetails

CREATE TABLE OrderDetails(
   OrderId BINARY(16) PRIMARY KEY,
   ProductName VARCHAR(100) NOT NULL,
   Price DECIMAL(10, 2) NOT NULL,
   ExpectedDelivery DATE NOT NULL
);

Bây giờ, chèn dữ liệu vào bảng OrderDetails. Ở đây, chúng ta sẽ sử dụng hàm UUID và UUID_TO_BIN() để gán giá trị trong cột OrderId

UUID là Mã định danh duy nhất toàn cầu được chỉ định bởi RFC 4122 (Đó là Không gian tên URN của Mã định danh duy nhất toàn cầu) và giá trị dài 128 bit. Nó được thiết kế theo cách tạo ra một số duy nhất trên toàn cầu theo không gian và thời gian. Nếu chúng ta gọi hai UUID liên tiếp, chúng ta sẽ nhận được hai giá trị khác nhau và thậm chí chúng được thực hiện trên hai thiết bị riêng biệt không được kết nối

GHI CHÚ. Mặc dù UUID() luôn tạo ra các giá trị duy nhất nhưng chúng không thể đoán được hoặc dự đoán được. Nó có nghĩa là nó luôn trả về một số ngẫu nhiên

Cấu trúc của UUID

UUID trong MySQL trả về một giá trị dài 128 bit. Nó được thể hiện ở định dạng con người có thể đọc được dưới dạng chuỗi UTF8 gồm năm số thập lục phân ở định dạng bên dưới

  • Ba số đầu tiên được tạo như một phần của định dạng dấu thời gian, chẳng hạn như thấp, trung bình và cao. Ở đây, phần cao chứa số phiên bản UUID
  • Số thứ tư chịu trách nhiệm duy trì tính duy nhất theo thời gian bất cứ khi nào giá trị dấu thời gian mất đi tính đơn điệu
  • Số thứ năm biểu thị số nút IEEE 802, biểu thị tính duy nhất về không gian. Nếu không có chữ sẽ thay số ngẫu nhiên không đảm bảo tính duy nhất về không gian

Sau đây là định dạng chuỗi hợp lệ của các giá trị UUID trong MySQL, là sự sắp xếp gồm 32 chữ số của định dạng thập lục phân cùng với bốn dấu gạch nối (-)

Chúng ta có thể tạo các giá trị UUID trong MySQL bằng hàm như sau

Hàm trên trả về giá trị UUID phù hợp với UUID phiên bản 1 được mô tả trong RFC 4122. Sau khi thực hiện thành công câu lệnh trên, nó sẽ tạo ra giá trị UUID như sau

Kiểu dữ liệu MySQL 8 UUID

MySQL UUID so với. AUTO_INCREMENT KHÓA CHÍNH

UUID trong MySQL là một giải pháp thay thế tốt cho AUTO_INCREMENT PRIMARY KEY. Sau đây là những ưu điểm của UUID so với AUTO_INCREMENT PRIMARY KEY

Thuận lợi

Sau đây là những ưu điểm của việc sử dụng UUID cho khóa chính

  • Các giá trị UUID trong MySQL là duy nhất trên các bảng, cơ sở dữ liệu và máy chủ. Nó cho phép chúng tôi hợp nhất các hàng từ cơ sở dữ liệu phân tán/khác nhau trên các máy chủ
  • Các giá trị UUID không cung cấp thông tin về dữ liệu của chúng tôi, điều đó có nghĩa là rất khó đoán. Vì vậy, nó an toàn để sử dụng trong các URL
  • Các giá trị UUID có thể được tạo ngoại tuyến có nghĩa là chúng ta có thể tạo nó ở bất cứ đâu mà không cần trao đổi thông tin với máy chủ cơ sở dữ liệu
  • Nó cũng đơn giản hóa việc sao chép (logic trong ứng dụng). Ví dụ muốn chèn dữ liệu vào bảng cha và bảng con thì trước hết phải chèn dữ liệu vào bảng cha, lấy id đã tạo rồi điền bản ghi vào bảng con. Sử dụng UUID, chúng ta có thể tạo giá trị PRIMARY KEY của bảng cha và đồng thời chèn các hàng vào cả hai bảng

Nhược điểm

Bên cạnh những ưu điểm, sau đây là những nhược điểm của việc sử dụng UUID cho khóa chính

  • Nếu chúng ta lưu trữ các giá trị UUID (16 byte) trong cơ sở dữ liệu, nó sẽ chiếm nhiều không gian/bộ nhớ hơn so với số nguyên (4 byte) hoặc số nguyên lớn (8 byte)
  • Nó làm cho việc gỡ lỗi khó khăn hơn. Ví dụ, chúng ta có thể hình dung biểu thức WHERE id = '185e6dfd-1cc8-11eb-9a2c-107d1a24f935' thay vì WHERE id = 5
  • Nó cũng có thể gây ra các vấn đề về hiệu suất do các giá trị không được sắp xếp theo thứ tự và kích thước của chúng

Giải pháp MySQL UUID

Chúng ta có thể khắc phục những sự cố này trong MySQL bằng cách sử dụng các chức năng được cung cấp bên dưới. Các chức năng này cho phép chúng tôi lưu trữ các giá trị UUID ở định dạng nhỏ gọn (BINARY) và hiển thị chúng ở định dạng con người có thể đọc được (VARCHAR). Tên của các chức năng là

  • UUID_TO_BIN
  • BIN_TO_UUID
  • LÀ_UUID

GHI CHÚ. Cần lưu ý rằng các chức năng này chỉ khả dụng trong phiên bản MySQL 8. 0 trở lên

Hàm UUID_TO_BIN() được sử dụng để chuyển đổi các giá trị UUID từ định dạng mà con người có thể đọc được thành định dạng nhỏ gọn để lưu trữ trong cơ sở dữ liệu

Hàm BIN_TO_UUID() được sử dụng để chuyển đổi UUID từ định dạng nhỏ gọn sang định dạng mà con người có thể đọc được để hiển thị

Hàm IS_UUID() được sử dụng để xác thực định dạng chuỗi của UUID. Nó trả về 1 khi đối số hợp lệ và trả về 0 đối với đối số không hợp lệ. Nếu đối số là NULL, nó sẽ trả về NULL

Ví dụ UUID của MySQL

Hãy cho chúng tôi hiểu cách sử dụng UUID với sự trợ giúp của một ví dụ. Đầu tiên, chúng ta sẽ tạo một bảng mới có tên là employee bằng cách sử dụng câu lệnh bên dưới

Tiếp theo, chúng ta cần chèn các giá trị vào bảng. Ngoài ra, nếu chúng ta muốn thêm các giá trị UUID vào cột emp_id, chúng ta phải sử dụng các hàm UUID() và UUID_TO_BIN() như sau

Bây giờ, hãy thực thi câu lệnh CHỌN để xác minh bản ghi đã chèn

Kiểu dữ liệu MySQL 8 UUID

Cuối cùng, chúng tôi sẽ truy vấn dữ liệu từ cột UUID bằng cách sử dụng hàm BIN_TO_UUID() để chuyển đổi định dạng nhị phân thành định dạng mà con người có thể đọc được. Xem tuyên bố dưới đây

Ta sẽ được kết quả như sau

Kiểu dữ liệu MySQL 8 UUID

MySQL UUID so với UUID (ngắn)

UUID() và UUID(ngắn) đều là các chức năng khác nhau trong MySQL. Sự khác biệt cơ bản giữa chúng được thảo luận trong biểu đồ so sánh dưới đây

UUID trong MySQL là kiểu dữ liệu nào?

Trong MySQL, giá trị UUID là một số 128 bit được biểu thị dưới dạng chuỗi utf8 và định dạng theo số thập lục phân sẽ là . Ở đây, ba số đầu tiên được tạo từ các phần thấp, trung bình và cao của dấu thời gian.

Kiểu dữ liệu nào là UUID?

Kiểu dữ liệu UUID được coi là kiểu con của kiểu dữ liệu CHUỖI , bởi vì các giá trị UUID được hiển thị ở định dạng văn bản chuẩn của chúng và ở dạng .

Làm cách nào để lưu trữ UUID trong MySQL?

Trong MySQL, bạn có thể lưu trữ các giá trị UUID ở định dạng nhỏ gọn ( BINARY ) và hiển thị chúng ở định dạng con người có thể đọc được ( VARCHAR ) với sự trợ giúp của các chức năng sau. UUID_TO_BIN . BIN_TO_UUID . IS_UUID .

MySQL có thể sử dụng UUID làm KHÓA CHÍNH không?

Sau đây là những ưu điểm của việc sử dụng UUID cho khóa chính . Các giá trị UUID trong MySQL là duy nhất trên các bảng, cơ sở dữ liệu và máy chủ. Nó cho phép chúng tôi hợp nhất các hàng từ cơ sở dữ liệu phân tán/khác nhau trên các máy chủ. Các giá trị UUID không cung cấp thông tin về dữ liệu của chúng tôi, điều đó có nghĩa là rất khó đoán.