Panjang karakter maks UUID

115

Kami menggunakan UUID sebagai kunci utama untuk out oracle DB, dan mencoba menentukan panjang karakter maksimal yang sesuai untuk VARCHAR. Rupanya ini adalah 36 karakter tetapi kami telah memperhatikan UUID yang dihasilkan lebih panjang dari ini - hingga 60 karakter. Apakah ada yang tahu max char length yang cocok untuk UUID ??

pengguna1753862
sumber
2
Karena UUID adalah angka 128 bit, saya sangat penasaran untuk melihat pengkodean apa yang akan mengubahnya menjadi string 60 karakter. Sepertinya encoding yang sangat buruk, atau masalah lain yang tidak saya sadari.
fvu
1
Apa RDBMS Anda? MS SQL memiliki tipe khusus untuk UUID, dan yang lainnya dapat dengan mudah menyimpan byte. Adakah alasan Anda ingin menyimpan ini sebagai VARCHARs?
@ user565869 menyimpannya sebagai byte sangat buruk untuk segala jenis inspeksi manual
Enerccio

Jawaban:

171

Bagian 3 dari RFC4122 memberikan definisi formal representasi string UUID. Ini 36 karakter (32 digit hex + 4 tanda hubung).

Sepertinya Anda perlu mencari tahu dari mana ID 60 karakter yang tidak valid berasal dan memutuskan 1) jika Anda ingin menerimanya, dan 2) berapa panjang maksimal ID tersebut yang mungkin didasarkan pada API apa pun yang digunakan untuk membuatnya.

broofa
sumber
64

Ini adalah jenis kolom yang tepat untuk didefinisikan sebagai CHAR 36, bukan VARCHAR 36, karena setiap nilai akan memiliki panjang yang sama persis. Dan Anda akan menggunakan lebih sedikit ruang penyimpanan, karena Anda tidak perlu menyimpan panjang data untuk setiap nilai, cukup nilainya.

apotek
sumber
9
CHAR dapat menggunakan lebih banyak ruang daripada VARCHAR jika kumpulan karakter Anda pada kolom multi-byte (lihat bagian bawah di stackoverflow.com/a/59686/1691446 )
David
7
Cukup yakin UUIDv4 hanya menggunakan latin-1 charset UTF-8, yang dalam hal ini tidak akan terpengaruh. Pastikan Anda memeriksa apakah Anda menggunakan rangkaian karakter yang berbeda.
Aaron_H
2
UUID dalam format string hanya dapat menggunakan kumpulan karakter ini (regex):, [0-9A-Fa-f-]yang merupakan 23 oktet berbeda di ASCII.
cowbert
RFC 4122 mengatakan UUID adalah 16 oktet atau 128 bit. Jika Anda menggunakan lebih dari penyimpanan sebanyak itu, Anda tidak mengkodekannya secara tidak efisien. Tidak perlu menyandikan tanda hubung, misalnya. Mereka tidak menambahkan informasi.
Trenton
4
@Trenton ada trade-off antara efisiensi penyimpanan dan keramahan pengguna. Seseorang dapat menyimpan UUID sebagai BINARY (16) untuk efisiensi penyimpanan maksimum, tetapi seseorang yang melihat DB tidak akan melihat representasi kanonik, dan bahasa pemrograman mungkin hanya memiliki sarana untuk membuat objek UUID dari representasi canonical / string, atau tidak memiliki tipe objek UUID sama sekali; UUID mungkin disimpan dalam bentuk string dalam sebuah file, membuat perbandingan dengan bentuk biner tidak praktis, dll.
TaylanUB
7

Sebagian besar database memiliki jenis UUID asli saat ini untuk mempermudah pengerjaannya. Jika milik Anda tidak, itu hanya angka 128-bit, jadi Anda dapat menggunakan BINARY (16), dan jika Anda membutuhkan format teks sering, misalnya untuk pemecahan masalah, tambahkan kolom terhitung untuk menghasilkannya secara otomatis dari kolom biner . Tidak ada alasan yang tepat untuk menyimpan bentuk teks (yang jauh lebih besar).

StephenS
sumber