Максимальна довжина символу UUID


115

Ми використовуємо UUID в якості основного ключа для видачі БД Oracle і намагаємося визначити відповідну максимальну довжину символів для VARCHAR. Мабуть, це 36 символів, але ми помітили, що UUID'S генерується довше, ніж до 60 символів. Хтось знає підходящу максимальну довжину лінійки для UUID ??


2
Оскільки UUID - це 128 бітне число, мені дуже цікаво побачити, яке кодування перетворило б його в 60-рядовий рядок. Виглядає як вкрай погане кодування, чи якась інша, нереальна для мене проблема.
fvu

1
Який у вас RDBMS? MS SQL має виділений тип для UUID, а інші можуть просто зберігати байти. Чи є якась причина, ви хочете зберігати їх як VARCHARs?

@ user565869 зберігання їх як байтів є жахливим для будь-якого ручного огляду
Enerccio

Відповіді:


171

Розділ 3 RFC4122 забезпечує формальне визначення рядкових представлень UUID. Це 36 символів (32 шістнадцяткових цифр + 4 тире).

Здається, вам потрібно з’ясувати, звідки беруться недійсні 60-знакові ідентифікатори, і вирішити 1), якщо ви хочете їх прийняти, і 2) якою може бути максимальна довжина цих ідентифікаторів, залежно від того, який API використовується для їх створення.


64

Це ідеальний вид поля, який слід визначити як CHAR 36, до речі, не VARCHAR 36, оскільки кожне значення матиме точно таку ж довжину. І ви будете використовувати менше місця для зберігання, оскільки вам не потрібно зберігати довжину даних для кожного значення, а лише значення.


9
CHAR може використовувати більше місця, ніж VARCHAR, якщо ваш набір символів у стовпці є багатобайтовим (див. Нижню частину на stackoverflow.com/a/59686/1691446 )
Девід

7
Досить впевнений, що UUIDv4 використовує лише схему latin-1 UTF-8, і в цьому випадку це не вплине. Однозначно перевірте, чи використовуєте ви іншу шаблону.
Aaron_H

2
UUID у рядковому форматі може використовувати лише цей набір символів (регулярний вираз):, [0-9A-Fa-f-]що становить 23 різних октетів в ASCII.
ковбер

RFC 4122 каже, що UUID мають 16 октетів або 128 біт. Якщо ви використовуєте більше, ніж стільки пам’яті, ви неефективно кодуєте їх. Наприклад, не потрібно кодувати тире, наприклад. Вони не додають ніякої інформації.
Трентон

4
@Trenton є компроміс між ефективністю зберігання та зручністю для користувачів. Можна було б зберігати UUID як BINARY (16) для досягнення максимальної ефективності зберігання, але хтось, переглядаючи БД, не побачив би канонічне представлення, а мова програмування може мати лише засоби створення об’єкта UUID з канонічного / рядкового представлення, чи ні взагалі мають тип об’єкта UUID; UUID може зберігатися у рядковій формі у файлі, що робить порівняння з двійковою формою громіздкою тощо.
TaylanUB

7

Більшість баз даних мають вбудований тип UUID в наші дні, щоб полегшити роботу з ними. Якщо у вас немає, це просто 128-бітні номери, тому ви можете використовувати BINARY (16), і якщо вам потрібен текст часто, наприклад, для усунення несправностей, то додайте обчислений стовпець, щоб автоматично генерувати його з двійкового стовпця . Немає вагомих причин зберігати (значно більшу) текстову форму.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.