รู้เบื้องต้นเกี่ยวกับประเภทข้อมูลใน SQL
ซึ่งแตกต่างจาก JavaScript, SQL มีการพิมพ์ที่แข็งแกร่ง ในทุกตาราง ทุกคอลัมน์มีประเภทข้อมูลคงที่ของตัวเอง
มีชนิดข้อมูลจำนวนมาก แต่ไม่เหมือนกับภาษา Java คือมีชนิดข้อมูลจำนวนมากไม่ใช่เพราะมีชนิดข้อมูลสำหรับทุกโอกาส ฐานข้อมูลขึ้นอยู่กับขนาดของข้อมูลเป็นอย่างมาก ดังนั้น ชนิดข้อมูลจำนวนมากจึงแตกต่างกันเฉพาะในความยาวเท่านั้น
โดยรวมแล้วสามารถแบ่งประเภทข้อมูลออกเป็น 5 กลุ่ม:
- ประเภทตัวเลข
- ประเภทสตริง
- ประเภทการจัดเก็บวันที่และเวลา
- วัตถุ: มักจะแสดงเป็นชุดของไบต์
- การขนส่ง : JSON และ XML
โดยปกติแล้ว DBMS ที่แตกต่างกันยังคงมีประเภทข้อมูลของตัวเอง DBMS แต่ละรายการมีความเชี่ยวชาญเฉพาะของตนเอง ดังนั้นการเพิ่มประเภทข้อมูลใหม่จึงเป็นเรื่องธรรมดามาก
อีกสิ่งหนึ่งคือการเพิ่มประเภทข้อมูลใหม่นั้นไม่เพียงพอ คุณต้องเพิ่มฟังก์ชั่นที่จะใช้งานได้รวมถึงทำให้งานนี้สะดวกและรวดเร็ว
หากคุณทำงานใน DBMS ของอุตสาหกรรม (องค์กร) ใด ๆ มีแนวโน้มว่าคุณจะต้องจัดการกับประเภทข้อมูลและหน้าที่ของมัน สิ่งที่จำเป็นต้องอ่านหนังสือดีๆ 2-5 เล่ม
ในฐานะที่เป็นส่วนหนึ่งของความคุ้นเคยกับ SQL เราจะพิจารณาประเภทข้อมูลหลักสามกลุ่ม:
- ตัวเลข
- สตริง
- วันที่
ประเภทตัวเลขใน SQL
ใน SQL ประเภทตัวเลขแบ่งออกเป็นสามกลุ่ม:
- ประเภทจำนวนเต็ม
- เลขจุดคงที่ (จำนวนทศนิยมคงที่)
- เลขทศนิยม
เริ่มต้นด้วยจำนวนเต็ม มีเพียง 5 รายการและสามารถอธิบายได้ในตารางเดียว:
| # | พิมพ์ชื่อ | ความยาวเป็นไบต์ | อะนาล็อกจาก Java | ค่าต่ำสุด | มูลค่าสูงสุด |
|---|---|---|---|---|---|
| 1 | ไทนี่อินท์ | 1 | ไบต์ | -128 | 127 |
| 2 | สมอลลินท์ | 2 | สั้น | -32.768 | 32.767 |
| 3 | ขนาดกลาง | 3 | -8,388,608 | 8,388,607 | |
| 4 | INT | 4 | นานาชาติ | -2,147,483,648 | 2,147,483,647 |
| 5 | บิ๊กอินท์ | 8 | ยาว | -2 63 | 2 63-1 |
ชนิดข้อมูลคล้ายกับชนิดข้อมูล Java แต่ก็มีชนิดจำนวนเต็มที่ยาวสามไบต์เช่นกัน ทำเพื่อประหยัดขนาด
ถัดมาประเภทจุดลอยตัวเช่นเดียวกับใน Java มีเพียงสองประเภทเท่านั้น:
| # | พิมพ์ชื่อ | ความยาวเป็นไบต์ | อะนาล็อกจาก Java | ค่าต่ำสุด | มูลค่าสูงสุด |
|---|---|---|---|---|---|
| 1 | ลอย | 4 | ลอย | -3.40E+38 | +1.18E+38 |
| 2 | สองเท่า | 8 | สองเท่า | -1.79E+308 | +1.79E+308 |
อีกครั้งไม่มีอะไรใหม่ ทุกอย่างเหมือนกับใน Java อย่างไรก็ตาม ไม่เหมือนกับ Java ตรง SQL มีชนิดพิเศษอีกประเภทหนึ่ง นั่นคือจำนวนจริงแบบจุดตายตัว มันเรียกว่าทศนิยม
โดยทั่วไปแล้วประเภทนี้จะใช้ในการจัดเก็บจำนวนเงิน เมื่อเขียนชื่อประเภทนี้ มักจะระบุว่ามีทศนิยมกี่ตำแหน่งก่อนและหลังจุดทศนิยม รูปแบบทั่วไปมีลักษณะดังนี้:
DECIMAL(total_characters, after_comma)
และตัวอย่างเล็กน้อย:
salary DECIMAL(5,2)
นี่คือวิธีที่เราอธิบายความจริงที่ว่าคอลัมน์เงินเดือนสามารถมีจำนวนเต็ม (ทศนิยมสูงสุด 3 ตำแหน่ง) และเศษส่วน - ทศนิยม 2 ตำแหน่ง
จำนวนอักขระสูงสุดที่ประเภท DECIMAL รองรับคือ 65
ประเภทสตริงใน SQL
แถวในฐานข้อมูลสามารถจัดเก็บได้สองรูปแบบ:
- สตริงความยาวคงที่
- สตริงที่มีความยาวผันแปรได้
ระบุสตริงความยาวคง ที่เป็น CHAR :
CHAR(length)
ความยาวคงที่หมายความว่าค่าทั้งหมดของคอลัมน์นี้จะมีจำนวนอักขระคงที่อย่างเคร่งครัด
ตัวอย่างของสตริงที่มีความยาวคงที่:
country_code CHAR(2)
สตริงความยาวผันแปรระบุตาม ประเภท VARCHAR :
VARCHAR(max_length)
ความยาวผันแปร หมายความว่าค่าทั้งหมดของคอลัมน์นี้จะมีข้อความที่มีความยาวเท่าใดก็ได้ แต่ไม่เกินความยาวสูงสุด
ตัวอย่างสตริงความยาวผันแปร:
phone VARCHAR(12)
สตริงที่มีความยาวคงที่มีข้อได้เปรียบอย่างมาก หากไคลเอนต์ขอให้เซิร์ฟเวอร์ SQL คืนแถวที่ 1,000,000 จากตารางให้เขา และแถวในตารางมีความยาวคงที่ เมื่อทราบความยาวของแถวแล้ว คุณสามารถคำนวณไบต์ที่เกี่ยวข้องกับที่ต้องการได้อย่างง่ายดาย แถว.
ในกรณีของบรรทัดที่มีความยาวผันแปร จะไม่สามารถค้นหาแถวที่ต้องการในตารางได้อย่างรวดเร็ว จำความเร็วในการเข้าถึง ArrayList และ LinkedList สถานการณ์จะใกล้เคียงกันที่นี่
ลองเปรียบเทียบวิธีจัดเก็บสตริงที่มีความยาวต่างกันในตาราง โดยขึ้นอยู่กับประเภทข้อมูล
| เส้น | ชาร์(4) | ไบต์ที่จะจัดเก็บ | วาร์ชาร์(4) | ไบต์ที่จะจัดเก็บ | |
|---|---|---|---|---|---|
| '' | ' ' | 4 | '' | 1 | |
| 'แอ๊บ' | 'แอ๊บ' | 4 | 'แอ๊บ' | 3 | |
| 'เอบีซีดี' | 'เอบีซีดี' | 4 | 'เอบีซีดี' | 5 | |
| 'abcdefgh' | 'เอบีซีดี' | 4 | 'เอบีซีดี' | 5 |
บันทึก. ประเภท VARCHAR ต้องการอีกหนึ่งไบต์สำหรับความยาวเดียวกัน เนื่องจากต้องเก็บความยาวของสตริงเพิ่มเติม
ประเภทชั่วคราวใน SQL
SQL ยังมีประเภทพิเศษสำหรับการจัดเก็บวันที่และเวลา มีทั้งหมดห้าประเภท:
| # | พิมพ์ชื่อ | อะนาล็อกจาก Java DateTime API | ตัวอย่าง | ค่าต่ำสุด | มูลค่าสูงสุด |
|---|---|---|---|---|---|
| 1 | วันที่ | วันที่ท้องถิ่น | '2022-06-30' | '1000-01-01' | '9999-12-31' |
| 2 | เวลา | เวลาท้องถิ่น | 'hh:mm:ss[.เศษส่วน]' | '-838:59:59.000000' | '838:59:59.000000' |
| 3 | วันเวลา | LocalDateTime | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
| 4 | ประทับเวลา | วันที่ | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
| 5 | ปี | พ.ศ. 2444 | 2155 |
ข้อมูลทั้งหมดในแบบสอบถามเขียนเป็นสตริง - ในเครื่องหมายอัญประกาศเดี่ยว รูปแบบรายการเริ่มจากใหญ่ไปหาเล็กที่สุด:
- ปี
- เดือน
- วัน
- ชั่วโมง
- นาที
- ที่สอง
- เสี้ยววินาที
ประเภท DATE, TIME และ DATETIME สามารถพิจารณาโดยทั่วไปว่าเป็นแอนะล็อกของประเภทจาก Java DateTme API: LocalDate, LocalTime, LocalDateTime ตรรกะเป็นเรื่องเดียวกัน
ประเภท TIMESTAMP เก็บข้อมูลในหน่วยมิลลิวินาทีตั้งแต่ต้นปี 1970 (มาตรฐานระบบปฏิบัติการ UNIX) ในรูปแบบนี้จะถูกจัดเก็บตามประเภทวันที่ในภาษาจาวา
และสุดท้ายคือประเภท YEAR ซึ่งมีความยาว 1 ไบต์และเก็บค่าตั้งแต่ 1 ถึง 255 ดังนั้นช่วงปีที่มีให้คือ 1901-2155 ประเภทนี้ไม่สามารถจัดเก็บปี 1900 ได้ เนื่องจากค่า 0 ใช้เพื่อเข้ารหัสค่า NULL
การจัดเก็บวัตถุใน SQL
มีประเภทพิเศษสำหรับจัดเก็บวัตถุหรือข้อความที่มีความยาวมาก เราจะไม่ลงรายละเอียดเกี่ยวกับพวกเขา แต่ฉันจะแสดงรายการต่อไป:
| # | พิมพ์ชื่อ | คำอธิบาย |
|---|---|---|
| 1 | ข้อความ | ใช้สำหรับเก็บข้อความยาวๆ เมื่อเปรียบเทียบและเรียงลำดับในฟิลด์นี้ จะใช้อักขระ 100 ตัวแรกเท่านั้น |
| 2 | หยด | ชื่อย่อมาจาก Byte Large Object เก็บเป็นเพียงชุดของไบต์ สามารถใช้เก็บรูปภาพในฐานข้อมูลได้ เช่น |
| 3 | CLOB | ชื่อย่อมาจาก Char Large Object ใช้สำหรับเก็บข้อความยาวๆ |
| 4 | ENUM | ให้คุณตั้งค่าชุดค่าคงที่และเก็บค่าใดค่าหนึ่งเป็นค่า |
| 5 | ชุด | ให้คุณตั้งค่าชุดค่าคงที่และเก็บชุดย่อยเป็นค่า มักจะเก็บไว้เป็นไบนารีมาสก์ |
ในทางทฤษฎี คุณสามารถซีเรียลไลซ์วัตถุ Java เป็นชุดของไบต์และจัดเก็บไว้ในฐานข้อมูลเป็น BLOB การบันทึกวัตถุไม่ใช่ปัญหา จะทำงานร่วมกับเขาต่อไปได้อย่างไร?
สมมติว่าตารางหนึ่งจัดเก็บวัตถุหนึ่งล้านชิ้นในรูปแบบซีเรียลไลซ์ คุณจะค้นหาผ่านสิ่งเหล่านี้ได้อย่างไร DBMS รองรับเฉพาะข้อมูลบางประเภทเมื่อมีชุดฟังก์ชันมากมายสำหรับการทำงานกับข้อมูลนั้น
GO TO FULL VERSION