มีสิ่งต่างๆเช่นประเภทข้อมูลที่กำหนดเองหรือไม่?


14

MySQL มีการสนับสนุนประเภทข้อมูลที่กำหนดเองหรือไม่? ตัวอย่างเช่นอาจมีการจัดเก็บรหัสไปรษณีย์ในvarchar(10)เขตข้อมูล แต่สามารถย่อเป็นได้intโดยมีตัวเลือกว่างเปล่าและตั้งค่าสถานะว่าเป็นรหัสไปรษณีย์ 5 หลักหรือ 5 + 4 หลัก

มีวิธีติดตั้งชนิดข้อมูลที่ไร้รอยต่อสำหรับสิ่งต่าง ๆ หรือไม่? เท่าที่แอปพลิเคชันเกี่ยวข้องมันจะเป็นประเภทสตริงจะมีการตัดทอนข้อมูล (โดยมีหรือไม่มีการเตือน) หากแอปพลิเคชันผ่านข้อมูลที่ไม่ถูกต้อง

สามารถใช้ฟังก์ชั่นที่กำหนดเองได้ (ตัวอย่างเช่นมีฟังก์ชั่นINET_ATONบิวด์อินสำหรับที่อยู่ IPv4 แต่ไม่อนุญาตให้ทำสิ่งต่าง ๆzip LIKE '12345%'ที่ควรทำดัชนีอย่างเหมาะสมการสนับสนุนที่เขียนอย่างดีสำหรับประเภทข้อมูลที่กำหนดเองจะอนุญาตให้ทำเครื่องหมายชนิดข้อมูล เป็นจัดเรียง. ดังนั้นขนาดกะทัดรัดเมื่อเรียงลำดับจะเรียงลำดับเช่นเดียวกับถ้ามันเป็นzip intzip varchar(10)

สิ่งนี้จะทำให้คอลัมน์มีความกว้างคงที่มันจะอนุญาตให้มีการลดขนาดหน่วยเก็บข้อมูลตัวแปร 6 หรือ 10 ไบต์ลงเหลือ 4 ไบต์ของความกว้างคงที่

มีการใช้งานที่เกี่ยวข้องหลายอย่าง

  • รหัสไปรษณีย์
  • ที่อยู่ IPv6
  • ฟิลด์การประทับเวลาที่กำหนดเองที่มีความแม่นยำระดับนาทีและความจุเกินกว่าที่2038มีการใช้พื้นที่เก็บข้อมูลน้อยกว่าdatetimeแต่ไม่จำเป็นต้องสนับสนุนวันที่ก่อนปีของการนำไปใช้ (กล่าวว่า min อาจเป็น 2007 หากเป็นวันที่เก่าที่สุดในระบบ)
  • การประทับเวลาที่ใช้ DST (ซึ่งไม่มีอยู่จริง )
  • รัฐสองตัวอักษรของสหรัฐอเมริกาสามารถจัดเก็บในไบต์เดียว
  • ความยาวENUMสามารถแยกออกเป็นประเภทข้อมูลที่กำหนดเองเพื่อให้DESCRIBEผลลัพธ์ที่ได้จะไม่ยุ่งเหยิงเมื่อมองด้วยการห่อทั้งหมด

ฉันคาดว่าตัวจัดการชนิดข้อมูลจะถูกจัดเก็บคล้ายกับวิธีการจัดเก็บฟังก์ชัน

มีอะไรในระยะไกลเช่นนี้ในเครื่องมือฐานข้อมูลใด ๆ ฉันส่วนใหญ่ใช้ MySQL แต่ฉันอยากรู้ว่าสิ่งนี้เคยถูกนำไปใช้หรือไม่ทำให้แอปพลิเคชันเรียกใช้ฟังก์ชันเช่นINET_ATONฟังก์ชัน

MS SQL ดูเหมือนจะมีบางอย่างในลักษณะนั้น แต่ฉันอยากจะรู้ว่ามันเป็นมากกว่าคำพ้อง (ตัวอย่างเช่นbooleanอาจจะเป็นคำพ้องหาtinyint(1)หรือpostal_codeอย่างใดอย่างหนึ่งcharหรือvarchar (5หรือ9หรือ10)) พ้องจะไม่ได้สิ่งที่ฉันถามเกี่ยวกับที่นี่


คำตอบง่ายๆ afaik สำหรับ mysql: ไม่ นี่น่าสนใจที่จะเห็นว่าคนอื่น ๆ จัดการกับสิ่งเหล่านี้อย่างไร
ดีเร็กดาวนีย์

@DTest: คุณมี CREATE TYPE ใน SQL Server: มีประโยชน์สำหรับประเภท CLR ทันที msdn.microsoft.com/en-us/library/ms175007(SQL.90).aspx
gbn

1
@ George Bailey: ลิงก์ SQL Server ของคุณล้าสมัย: สำหรับ SQL Server 2000 และสำหรับ MySQL โปรดดูstackoverflow.com/q/2451435/27535
gbn

@gbn, (ตอบกลับความคิดเห็นแรก) มีการแปลประเภทหรือไม่เช่นจะแปลงเป็นIPv6a binary(16)หรือ จำกัด เฉพาะ aliasing (ซึ่งสามารถใช้สำหรับการstateเป็นenums)
Bryan Field

1
โปรดทราบว่าการจัดเก็บซิปรหัสเป็นintจะไม่ทำงานฐานข้อมูลสำหรับสากล - แคนาดายกตัวอย่างเช่นการใช้รูปแบบของ 'A9A A9A ฯ การสร้างประเภทข้อมูลที่กำหนดเองสำหรับรหัสไปรษณีย์น่าจะเป็นความคิดที่ดี อย่างไรก็ตามคุณอาจต้องการตรวจสอบอีกครั้งว่าคุณวางแผนที่จะจัดการกับสิ่งเหล่านั้นอย่างไร (การจัดเก็บสถานะในเขตข้อมูลไบต์เดียวมีปัญหา 'อื่น ๆ ' ที่อาจเกิดขึ้นได้) และอย่าดำเนินการประเภทข้อมูลวันที่ / เวลาอีกครั้งเว้นแต่ว่าข้อมูลที่ให้นั้นจะไม่เพียงพอ (ขนาดไม่นับ) คุณจะสร้างความสับสนให้กับผู้คน
Clockwork-Muse

คำตอบ:


14

MySQL มีการสนับสนุนประเภทข้อมูลที่กำหนดเองหรือไม่?

คำตอบง่ายๆ: ไม่

มีอะไรในระยะไกลเช่นนี้ในเครื่องมือฐานข้อมูลใด ๆ ฉันส่วนใหญ่ใช้ MySQL แต่ฉันอยากรู้ว่าสิ่งนี้เคยถูกนำไปใช้หรือไม่ทำให้แอปพลิเคชันเรียกใช้ฟังก์ชันเช่นฟังก์ชัน INET_ATON

Oracle มีCREATE TYPEลักษณะคล้ายกับระดับ OO บางระดับซึ่งรวมถึงคุณลักษณะต่างๆเช่นฟังก์ชันสมาชิกและการสืบทอด

Postgres มีCREATE TYPEน้อยกว่าเช่นคลาส OO (ไม่มีฟังก์ชั่นสมาชิกหรือการสืบทอด) แต่มีความยืดหยุ่นและมีประโยชน์อย่างไม่น่าเชื่อแม้จะช่วยให้คุณสร้างประเภทฐานใหม่ นอกจากนี้ยังCREATE DOMAINมีรูปแบบการสืบทอดหรือการพิมพ์ย่อยและช่วยขยายประเภทฐานโดยมีข้อ จำกัด บางประการ Postgres ยังมีค่อนข้างน้อยประเภทฐานที่น่าสนใจโดยค่าเริ่มต้นเช่นinetและเรขาคณิตประเภท ใน Postgres หนึ่งสามารถเขียนเป็นส่วนขยายใน C สำหรับประเภทข้อมูลที่กำหนดเองเช่นในตัวอย่างนี้ที่นี่กับชนิดข้อมูล base36

SQL Server CREATE TYPEช่วยให้คุณสามารถสร้างชนิดข้อมูลที่กำหนดเองตามชนิดข้อมูลระบบที่มีอยู่ ตัวอย่างเช่นฉันสามารถสร้างประเภทที่เรียกว่าSSNซึ่งกำหนดโดยทั่วไปเป็นVARCHAR(11)แต่ด้วยวิธีนี้ฉันไม่ต้องจำได้ว่ามันเป็นสนามขนาดใหญ่


1
โปรดกองและแก้ไขคำตอบนี้เพื่อให้เราได้รับการอ้างอิงที่ชัดเจน ฉันรู้สึกว่าคำถามที่ยืมมานั้นเป็นคำตอบ CW ...
แจ็คบอกว่าลอง topanswers.xyz

0

Firebirdนอกจากนี้ยังมีวิธีการแก้ปัญหามันผ่านโดเมน

ใน Firebird แนวคิดของ“ ชนิดข้อมูลที่ผู้ใช้กำหนด” ถูกนำไปใช้ในรูปแบบของโดเมน การสร้างโดเมนไม่ได้สร้างประเภทข้อมูลใหม่อย่างแท้จริง โดเมนมีวิธีการห่อหุ้มชนิดข้อมูลที่มีอยู่ด้วยชุดของคุณลักษณะและทำให้ "แคปซูล" นี้พร้อมใช้งานสำหรับการใช้งานที่หลากหลายในฐานข้อมูลทั้งหมด หากหลายตารางต้องการคอลัมน์ที่กำหนดด้วยแอตทริบิวต์ที่เหมือนกันหรือเกือบเหมือนกันโดเมนจะสมเหตุสมผล

การใช้โดเมนไม่ จำกัด เฉพาะคำจำกัดความคอลัมน์สำหรับตารางและมุมมอง โดเมนสามารถใช้เพื่อประกาศพารามิเตอร์อินพุตและเอาต์พุตและตัวแปรในโค้ด PSQL


เป็น Firebird MySQL หรือไม่
Anthony Genovese

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