Độ dài ký tự tối đa của UUID


115

Chúng tôi đang sử dụng UUID làm khóa chính cho Oracle DB và cố gắng xác định độ dài ký tự tối đa thích hợp cho VARCHAR. Rõ ràng đây là 36 ký tự nhưng chúng tôi nhận thấy UUID'S được tạo dài hơn thế này - độ dài lên đến 60 ký tự. Có ai biết độ dài char tối đa phù hợp cho UUID không ??


2
Vì UUID là một số 128 bit, tôi thực sự tò mò muốn xem mã hóa nào sẽ chuyển nó thành chuỗi ký tự 60. Có vẻ như mã hóa cực kỳ kém hoặc một số vấn đề khác chưa được giải đáp đối với tôi.
fvu

1
RDBMS của bạn là gì? MS SQL có một loại dành riêng cho UUID và những loại khác có thể chỉ cần lưu trữ các byte. Có lý do nào bạn muốn lưu trữ những thứ này dưới dạng VARCHARs?

@ user565869 lưu trữ chúng như byte là khủng khiếp cho bất kỳ loại kiểm tra thủ công
Enerccio

Câu trả lời:


171

Phần 3 của RFC4122 cung cấp định nghĩa chính thức về biểu diễn chuỗi UUID. Đó là 36 ký tự (32 chữ số hex + 4 dấu gạch ngang).

Có vẻ như bạn cần tìm ra nguồn gốc của các ID 60 ký tự không hợp lệ và quyết định 1) nếu bạn muốn chấp nhận chúng và 2) độ dài tối đa của các ID đó có thể dựa trên bất kỳ API nào được sử dụng để tạo chúng.


64

Nhân tiện, đây là loại trường hoàn hảo để định nghĩa là CHAR 36, không phải VARCHAR 36, vì mỗi giá trị sẽ có cùng độ dài chính xác. Và bạn sẽ sử dụng ít không gian lưu trữ hơn, vì bạn không cần lưu trữ độ dài dữ liệu cho mỗi giá trị, chỉ cần giá trị.


9
CHAR có thể sử dụng không gian hơn VARCHAR nếu bộ ký tự của bạn trên cột là đa byte (xem phần dưới cùng trên stackoverflow.com/a/59686/1691446 )
David

7
Khá chắc chắn UUIDv4 chỉ sử dụng bộ ký tự latin-1 của UTF-8, trong trường hợp này, điều này sẽ không bị ảnh hưởng. Chắc chắn hãy kiểm tra xem bạn có đang sử dụng một bộ ký tự khác hay không.
Aaron_H

2
UUID ở định dạng chuỗi chỉ có thể sử dụng bộ ký tự này (regex):, [0-9A-Fa-f-]là 23 bộ tám riêng biệt trong ASCII.
cowbert

RFC 4122 cho biết UUID là 16 octet hoặc 128 bit. Nếu bạn đang sử dụng nhiều hơn dung lượng lưu trữ, bạn mã hóa chúng không hiệu quả. Chẳng hạn, không cần mã hóa dấu gạch ngang. Họ không thêm thông tin.
Trenton

4
@Trenton có sự đánh đổi giữa hiệu quả lưu trữ và tính thân thiện với người dùng. Người ta có thể lưu trữ UUID dưới dạng BINARY (16) để có hiệu quả lưu trữ tối đa, nhưng ai đó nhìn qua DB sẽ không thấy biểu diễn chuẩn và ngôn ngữ lập trình có thể chỉ có phương tiện tạo đối tượng UUID từ biểu diễn chuẩn / chuỗi hoặc không có một loại đối tượng UUID nào cả; UUID có thể được lưu trữ ở dạng chuỗi trong một tập tin, làm cho so sánh với các hình thức rườm rà nhị phân vv
TaylanUB

7

Ngày nay, hầu hết các cơ sở dữ liệu đều có loại UUID gốc để làm việc với chúng dễ dàng hơn. Nếu không, chúng chỉ là số 128 bit, vì vậy bạn có thể sử dụng BINARY (16) và nếu bạn cần định dạng văn bản thường xuyên, ví dụ: để khắc phục sự cố, thì hãy thêm một cột được tính toán để tạo nó tự động từ cột nhị phân . Không có lý do chính đáng để lưu trữ dạng văn bản (lớn hơn nhiều).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.