ความยาวอักขระสูงสุด UUID


115

เรากำลังใช้ UUID เป็นคีย์หลักสำหรับออก oracle DB และพยายามกำหนดความยาวอักขระสูงสุดที่เหมาะสมสำหรับ 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) ความยาวสูงสุดของ ID เหล่านั้นอาจขึ้นอยู่กับ API ใด ๆ ที่ใช้ในการสร้าง


64

นี่คือชนิดของฟิลด์ที่สมบูรณ์แบบที่จะกำหนดเป็น CHAR 36 อย่างไรก็ตามไม่ใช่ VARCHAR 36 เนื่องจากแต่ละค่าจะมีความยาวเท่ากันทุกประการ และคุณจะใช้พื้นที่เก็บข้อมูลน้อยลงเนื่องจากคุณไม่จำเป็นต้องเก็บความยาวข้อมูลสำหรับแต่ละค่าเพียงแค่ค่า


9
CHAR อาจใช้พื้นที่มากกว่า VARCHAR หากชุดอักขระของคุณในคอลัมน์เป็นแบบหลายไบต์ (ดูส่วนล่างในstackoverflow.com/a/59686/1691446 )
David

7
ค่อนข้างแน่ใจว่า UUIDv4 ใช้เฉพาะชุดอักขระละติน -1 ของ UTF-8 ซึ่งในกรณีนี้จะไม่ได้รับผลกระทบ ตรวจสอบให้แน่ใจว่าคุณใช้ชุดอักขระอื่นหรือไม่
Aaron_H

2
UUID ในรูปแบบสตริงสามารถใช้ได้เฉพาะชุดของอักขระนี้ (regex): [0-9A-Fa-f-]ซึ่งเป็น 23 อ็อกเต็ตที่แตกต่างกันใน ASCII
cowbert

RFC 4122 กล่าวว่า UUID คือ 16 อ็อกเต็ตหรือ 128 บิต หากคุณใช้พื้นที่เก็บข้อมูลมากกว่านั้นแสดงว่าคุณเข้ารหัสได้อย่างไม่มีประสิทธิภาพ ไม่จำเป็นต้องเข้ารหัสเครื่องหมายขีดกลางเช่น พวกเขาไม่เพิ่มข้อมูล
เทรนตัน

4
@Trenton มีการแลกเปลี่ยนระหว่างประสิทธิภาพการจัดเก็บและความเป็นมิตรกับผู้ใช้ หนึ่งสามารถจัดเก็บ UUID เป็น BINARY (16) เพื่อประสิทธิภาพในการจัดเก็บสูงสุด แต่ผู้ที่มองข้าม DB จะไม่เห็นการแสดงตามมาตรฐานและภาษาโปรแกรมอาจมีวิธีการสร้างวัตถุ UUID จากการแทนมาตรฐาน / สตริงเท่านั้นหรือไม่ มีประเภทวัตถุ UUID เลย UUID อาจถูกจัดเก็บในรูปแบบสตริงในไฟล์ทำให้การเปรียบเทียบกับรูปแบบไบนารียุ่งยาก ฯลฯ
TaylanUB

7

ฐานข้อมูลส่วนใหญ่มีประเภท UUID ดั้งเดิมในปัจจุบันเพื่อให้การทำงานกับพวกเขาง่ายขึ้น หากคุณไม่ทำก็เป็นเพียงตัวเลข 128 บิตดังนั้นคุณสามารถใช้ BINARY (16) และหากคุณต้องการรูปแบบข้อความบ่อยๆเช่นสำหรับการแก้ไขปัญหาให้เพิ่มคอลัมน์จากการคำนวณเพื่อสร้างโดยอัตโนมัติจากคอลัมน์ไบนารี . ไม่มีเหตุผลที่ดีในการจัดเก็บรูปแบบข้อความ (ใหญ่กว่ามาก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.