UUID maks. Karakter uzunluğu


115

Oracle DB için birincil anahtar olarak UUID kullanıyoruz ve VARCHAR için uygun bir maksimum karakter uzunluğu belirlemeye çalışıyoruz. Görünüşe göre bu 36 karakter, ancak UUID'lerin bundan daha uzun olan 60 karakter uzunluğa kadar oluşturulduğunu fark ettik. UUID için uygun bir maksimum karakter uzunluğunu bilen var mı?


2
Bir UUID 128 bitlik bir sayı olduğundan, hangi kodlamanın onu 60 karakterlik bir dizeye dönüştürebileceğini gerçekten merak ediyorum. Bana ya aşırı derecede zayıf kodlama ya da başka bir anlaşılmamış problem gibi görünüyor.
fvu

1
RDBMS'niz nedir? MS SQL, UUID'ler için özel bir türe sahiptir ve diğerleri baytları kolayca depolayabilir. Bunları VARCHARs olarak saklamak istemenizin bir nedeni var mı ?

@ user565869 bunları bayt olarak saklamak her türlü manuel inceleme için korkunç
Enerccio

Yanıtlar:


171

RFC4122'nin 3. Bölümü , UUID dizgi temsillerinin biçimsel tanımını sağlar. 36 karakter (32 onaltılık rakam + 4 kısa çizgi).

Geçersiz 60 karakterlik kimliklerin nereden geldiğini bulmanız ve 1) bunları kabul etmek isteyip istemediğinize ve 2) bunları oluşturmak için kullanılan API'ye bağlı olarak bu kimliklerin maksimum uzunluğunun ne olabileceğine karar vermeniz gerekiyor gibi görünüyor.


64

Bu, her bir değerin tam olarak aynı uzunluğa sahip olacağından, bu arada VARCHAR 36 olarak değil, CHAR 36 olarak tanımlamak için mükemmel bir alan türüdür. Ve her bir değer için veri uzunluğunu depolamanıza gerek olmadığı için daha az depolama alanı kullanırsınız, sadece değeri.


9
Sütundaki karakter kümeniz çok baytlıysa CHAR, VARCHAR'dan daha fazla boşluk kullanabilir ( stackoverflow.com/a/59686/1691446'daki alt kısma bakın )
David

7
UUIDv4'ün yalnızca UTF-8'in latin-1 karakter setini kullandığından oldukça emin, bu durumda bu etkilenmeyecektir. Yine de farklı bir karakter seti kullanıp kullanmadığınızı kesinlikle kontrol edin.
Aaron_H

2
Dize biçimindeki UUID, yalnızca [0-9A-Fa-f-]ASCII'de 23 farklı sekizlik olan bu karakter kümesini (regex) kullanabilir .
cowbert

RFC 4122, UUID'lerin 16 sekizli veya 128 bit olduğunu söylüyor. Bu kadar çok depolama alanı kullanıyorsanız, onları verimsiz bir şekilde kodluyorsunuz. Örneğin, kısa çizgileri kodlamaya gerek yoktur. Hiçbir bilgi eklemiyorlar.
Trenton

4
@Trenton, depolama verimliliği ve kullanıcı kolaylığı arasında bir denge vardır. Maksimum depolama verimliliği için UUID'ler BINARY (16) olarak saklanabilir, ancak DB'ye bakan biri kanonik gösterimi göremez ve bir programlama dili yalnızca kanonik / dizgi gösteriminden bir UUID nesnesi oluşturma aracına sahip olabilir veya olmayabilir bir UUID nesne türüne sahip olmak; UUID, ikili formla karşılaştırma yaparak bir dosyada dize biçiminde saklanabilir, vb.
TaylanUB

7

Çoğu veritabanında, onlarla çalışmayı kolaylaştırmak için bugünlerde yerel bir UUID türü vardır. Sizinki yoksa, bunlar sadece 128 bitlik sayılardır, bu nedenle BINARY (16) kullanabilirsiniz ve metin biçimine sık sık ihtiyacınız varsa, örneğin sorun giderme için, ikili sütundan otomatik olarak oluşturmak için hesaplanan bir sütun ekleyin . Metin biçimini (çok daha büyük) saklamak için iyi bir neden yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.