หลายๆ ครั้ง ที่ Programmer ที่เพิ่งเริ่มเขียน Oracle PL/SQL มักมีคำถามเกี่ยวกับ Number เสมอ เนื่องจาก Data type ที่เป็น Number นั้น มีหลายแบบ เช่น Integer , Number ,Float เป็นต้น ทำให้ไม่แน่ใจว่าควรเลือกใช้งานอย่างไรดี เพื่อให้เหมาะสม ลองมาดูกันว่า แต่ละคำถามนั้น มีคำตอบกันอย่างไรบ้าง
Q: ข้อแตกต่างระหว่าง Number และ Integer ? A: Integer นั้นเป็น Sub Type ของ Number ที่มีขนาด 38 หลักเสมอ = Number(38,0) ซึ่งแสดงให้เห็นว่า Integer เป็นType ทีมีนาดใหญ่สุดเท่าที่ Number จะสามารถเก็บค่าได้ และ ข้อแตกต่างอีกอย่างคือ เมื่อค่าที่ได้เป็นจุดทศนิยม สำหรับ Data Type ที่เป็น Integer Oracle จะทำการปัดทศนิยมเสมอ เช่น ค่า 2.5 Oracle จะปัดขึ้นเป็น 3 Q: Integer เร็วกว่า Number หรือไม่ ? A: ถ้าดูจากคำถามแรก ก็พอจะได้คำตอบว่า ไม่ เพราะว่า Integer มีข้อกำหนดคือ 38 เสมอ แต่ขณะที่ Number สามารถกำหนดได้ว่า จะใช้ขนาดเท่าไหร่ ตรงนี้คือจุดที่มีผลกับความเร็ว แต่อันนี้ ต้องลองทดสอบกันจริงๆจังๆ ซึ่งผมก็ไม่เคยทดสอบซักครั้ง Q: Integer ใช้พื้นที่เก็บค่าน้อยกว่า Number ? และ Number(3,0) ใช้พื้นที่เก็บค่าน้อยกว่า Integer ? A : ไม่ใช่ Oracle ใช้พื้นที่สำหรับเก็บค่าเท่ากับค่าจริงๆ ก็คือ เก็บค่า 1 ใช้พี้นที่ น้อยกว่า เก็บค่า 700 แน่นอน Q: สำหรับตัวเลขที่เป็นจุดทศนิยม ควรจะใช้ Data Type ที่เป็น Number หรือ ว่า Float ? A: Float เป็น Sub Type ของ Number ใน Oracle นั้นมี Data Type สำหรับจุดทศนิยมอีก 2 ประเภท คือ Binary_float และ Binary_double ซึ่งมีไว้เพื่อประโยชน์ทางด้าน performance แต่ข้อด้อยกว่า Number คือ เก็บจำนวนเต็มได้น้อยกว่า ดังนั้น ถ้าต้องเลือกใช้งาน Data Type โดยทั่วไป เช่น เก็บค่าสำหรับการคำนวณ ผมเลือก Number เป็นอันดับแรก ยกเว้นกรณีที่ต้องการ Performance จริงๆ ซึ่งต้องเป็นการคำวณเป็น ล้านๆ หรือ พันล้านคำสั่ง จึงจะเห็นความแตกต่าง Q: เมื่อไหร่ควรเลือกใช้ Number เมื่อไหร่ควรเลือกใช้ Varchar2 ? A: เมื่อต้องใช้ข้อมูลที่เก็บไว้ เพื่อนำไปคำนวณทางตัวเลข ให้เลือกใช้ Number ถ้าไม่ใช่เพื่อคำวณ ก็เลือกใช้ Varchar2 อีกนัยหนึ่งก็คือ เก็บ Data ให้เหมาะกับการใช้งาน รวมไปถึง วันที่ก็ควรเป็น Type Date เช่น Table Product มี ID , Name , Price สามารถใช้ ID Number มี Data Type เป็น Varchar2 Name Data type เป็น Varchar2 ส่วน Price ใช้ Data Type เป็น Number ยกเว้น พวก Surrogate Key ที่ได้จาก Sequence Data Type ที่ได้จาก Sequenceเป็น Number อยู่แล้ว ใช้ Data Type เป็น Number ไม่จำเป็น ต้อง Convert มาเป็น Varchar2 หวังว่าคงเป็นประโยชน์บ้างนะครับ ที่มา http://it.toolbox.com/blogs/oracle-guide/oracle-data-types-5-faqs-about-number-30525 |