วันอังคารที่ 20 มกราคม พ.ศ. 2558

ชนิดข้อมูลใน MySQL

ชนิดข้อมูลใน MySQL


                      DATETIME : เป็นฟิลด์ชนิดที่เหมาะสมกับการเก็บข้อมูลวันที่ และเวลา  โดยจะเก็บได้ตั้งแต่ 1 มกราคม ค.ศ. 1000 เวลา 00:00:00 ไปจนถึง 31 ธันวาคม ค.ศ. 9999 เวลา 23:59:59 ครับ โดยรูปแบบการแสดงผล เวลาที่ทำการสืบค้น (query) ออกมา จะเป็น YYYY-MM-DD HH:MM:SS 
                      TIMESTAMP[(M)] : เอาไว้เก็บเวลา แต่จะเก็บในรูปแบบของ YYYYMMDDHHMMSS หรือ YYMMDDHHMMSS หรือ YYYYMMDD หรือ YYMMDD แล้วแต่ว่าเราจะระบุค่า M เป็น 14, 12, 8 หรือ 6 ตามลำดับ  เราสามารถเก็บได้ตั้งแต่วันที่ 1 มกราคม ค.ศ. 1000 ไปจนถึงแถวๆ ปี ค.ศ. 2037 ครับ

                     TIME : เอาไว้เก็บเวลา   มีค่าได้ตั้งแต่ -838:59:59 ไปจนถึง 838:59:59 โดยจะแสดงผลออกมาในรูปแบบ HH:MM:SS  YEAR[(2/4)] :   คือเอาไว้เก็บปี ในรูปแบบ YYYY หรือ YY แล้วแต่ว่าจะเลือก 2 หรือ 4 (หากไม่ระบุ จะถือว่าเป็น 4 หลัก) โดยหากเลือกเป็น 4 หลัก จะเก็บค่าได้ตั้งแต่ ค.ศ. 1901 ถึง 2155 แต่หากเป็น 2 หลัก จะเก็บตั้งแต่ ค.ศ. 1970 ถึง 2069       ข้อสังเกต     มีข้อสังเกตเกี่ยวกับฟิลด์ชนิด TIMESTAMP และ YEAR  นั่นก็คือ
          ค่าที่เก็บในฟิลด์ชนิด TIMESTAMP นั้นจะมีความสามารถพอๆ กับ การเก็บข้อมูลวัน               เดือนปี และเวลา ด้วยฟิลด์ชนิด VARCHAR แต่ต่างกันตรงที่ จะใช้เนื้อที่เก็บข้อมูลน้อย           กว่า ทว่า ฟิลด์ประเภท TIMESTAMP นั้นจะมีข้อจำกัดในเรื่องของเวลาที่สามารถเก็บ             ได้ คือจะต้องอยู่ในระหว่าง 1 มกราคม ค.ศ. 1000 ไปจนถึงแถวๆ ค.ศ. 2037 แต่หากเก็บ           เป็น VARCHAR นั้นจะไม่ติดข้อจำกัดนี้
          ฟิลด์ชนิด YEAR ก็เช่นกัน ใช้เนื้อที่แค่ 1 ไบต์เท่านั้นในการเก็บข้อมูล แต่ข้อจำกัดจะอยู่           ที่ ปี ค.ศ. 1901 ถึง 2155 เท่านั้น (หรือ ค.ศ. 1970 ถึง 2069 ในกรณี 2 หลัก) แต่หากเก็บ             เป็น VARCHAR จะได้ตั้งแต่ 0000 ถึง 9999 

                     CHAR : เป็นข้อมูลประเภท string แบบที่ถูกจำกัดความกว้างเอาไว้คือ 255 ตัวอักษร ไม่สามารถปรับเปลี่ยนได้เหมือนกับ VARCHAR  หากเราทำการสืบค้นโดยเรียงตามลำดับ มันก็จะเรียงข้อมูลแบบ case-sensitive คือ คำนึงถึงตัวอักษรเล็ก และใหญ่ เว้นเสียแต่เราจะกำหนดแอตทริบิวต์เป็น BINARY ที่จะทำให้การเรียงข้อมูลเป็นแบบ non case-sensitive ครับ คือ ตัวอักษรใหญ่ และเล็ก มีค่าเท่ากัน

                      TINYBLOB : ฟิลด์ชนิด BLOB นั้นจะมีไว้เพื่อเก็บข้อมูลประเภทไบนารี พูดง่ายๆ คือพวก ไฟล์ข้อมูลต่างๆ, ไฟล์รูปภาพ, ไฟล์มัลติมีเดีย เป็นต้น คือไฟล์อะไรก็ตามที่อัพโหลดผ่านฟอร์มอัพโหลดไฟล์ในภาษา HTML  โดย TINYBLOB นั้นจะมีเนื้อที่ให้เก็บข้อมูลได้ 256 ไบต์ 

                       TINYTEXT : ในกรณีที่ข้อความยาวๆ หรือต้องการที่จะค้นหาข้อความ โดยอาศัยฟีเจอร์ FULL TEXT SEARCH ของ MySQL  เราอาจจะเลือกที่จะไม่เก็บข้อมูลลงในฟิลด์ประเภท VARCHAR ที่มีข้อจำกัดแค่ 256 ตัวอักษร แต่เราจะเก็บลงฟิลด์ประเภท TEXT แทน  TINYTEXT นี้ จะให้เราเก็บข้อมูลได้ 256 ตัวอักษร ครับ ซึ่งมองเผินๆ ก็ไม่ต่างกับเก็บลงฟิลด์ประเภท CHAR หรือ VARCHAR(255) เลย แต่จริงๆ มันต่างกันตรงที่ มันทำ FULL TEXT SEARCH ได้
                       
                      BLOB : เหมือน TINYBLOB ครับ แต่สามารถเก็บข้อมูลได้ 64KB

                     MEDIUMBLOB : เหมือน TINYBLOB เช่นกัน แต่เก็บข้อมูลได้ 16MB 

                     MEDIUMTEXT : เหมือน TEXT ครับ แต่เก็บข้อมูลได้ 16,777,215 ตัวอักษร 

                      LONGBLOB : เหมือน TINYBLOB เช่นกัน แต่เก็บข้อมูลได้ 4GB 

                     LONGTEXT : เหมือน TEXT ครับ แต่เก็บข้อมูลได้ 4,294,967,295 ตัวอักษร 
ข้อสังเกต
                ฟิลด์ประเภท BLOB นั้น แม้จะมีประโยชน์ในเรื่องของการเก็บข้อมูลประเภท BINARY ให้อยู่กับตัวฐานข้อมูล ทำให้สะดวกเวลาสืบค้นก็ตาม แต่มันก็ทำให้ฐานข้อมูลบวมเกินความจำเป็นด้วยครับ ทำให้เกิดความไม่สะดวกในการสำรองฐานข้อมูลในกรณีที่ มีข้อมูลอัพโหลดไปเก็บมากๆ โดยปกติแล้ว เราจะใช้วิธีการอัพโหลดไปเก็บไว้ในโฟลเดอร์ แล้วเก็บลิงก์ไปยังไฟล์เหล่านั้น เป็นฟิลด์ชนิด VARCHAR มากกว่า
                  
                    SMALLINT : เป็นฟิลด์สำหรับเก็บข้อมูลชนิดตัวเลขที่มีขนาดใหญ่ขึ้นมาอีกหน่อย คือ 16 บิต จึงสามารถเก็บค่าได้ตั้งแต่ -32768 ถึง 32767 (ในกรณีแบบคิดเครื่องหมาย) หรือ 0 ถึง 65535 (ในกรณี UNSIGNED หรือไม่คิดเครื่องหมาย)    สามารถเลือก Attribute เป็น UNSIGNED และ UNSIGNED ZEROFILL ได้เช่นเดียวกับ TINYINT

                    MEDIUMINT : เช่นเดียวกับ SMALLINT     แต่จะมีขนาดใหญ่ขึ้นมาอีก ก็คือ 24 บิต  นั่นก็หมายความว่าสามารถเก็บข้อมูลตัวเลขได้ตั้งแต่ -8388608 ไปจนถึง 8388607 (ในกรณีแบบคิดเครื่องหมาย) หรือ 0 ถึง 16777215 (ในกรณีที่เป็น UNSIGNED หรือไม่คิดเครื่องหมาย)  สามารถเลือก Attribute เป็น UNSIGNED และ UNSIGNED ZEROFILL ได้เช่นเดียวกับ TINYINT

                    INT : เช่นเดียวกับ SMALLINT เช่นกัน แต่จะเป็นขนาดปกติคือ 32 บิต หรือสามารถเก็บข้อมูลได้ตั้งแต่ -2147483648 ไปจนถึง 2147483647  (ในกรณีแบบคิดเครื่องหมาย) หรือ 0 ถึง 4294967295 (ในกรณีที่เป็น UNSIGNED หรือไม่คิดเครื่องหมาย)  สามารถเลือก Attribute เป็น UNSIGNED และ UNSIGNED ZEROFILL ได้เช่นเดียวกับ TINYINT

                    BIGINT : ในกรณีที่ต้องการเก็บค่าตัวเลขแบบเยอะสุดๆ ก็ใช้นี่เลย                   เก็บข้อมูลแบบ 64 บิต สามารถเก็บข้อมูลได้ตั้งแต่ -9223372036854775808 ไปจนถึง 9223372036854775807 เลยทีเดียว (แบบคิดเครื่องหมาย) หรือ 0 ถึง 18446744073709551615 (ในกรณีที่เป็น UNSIGNED หรือไม่คิดเครื่องหมาย) สามารถเลือก Attribute เป็น UNSIGNED และ UNSIGNED ZEROFILL ได้เช่นเดียวกับ TINYINT
     
                    FLOAT[(M,D)] : ที่กล่าวถึงไปทั้งหมด ในตระกูล INT นั้นจะเป็นเลขจำนวนเต็ม หากเราบันทึกข้อมูลที่มีเศษทศนิยม มันจะถูกปัดทันที ดังนั้นหากเราต้องการจะเก็บค่าที่เป็นเลขทศนิยม เราต้องเลือกชนิดของฟิลด์เป็น FLOAT  อันนี้จะเก็บข้อมูลแบบ 32 บิต คือมีค่าตั้งแต่ -3.402823466E+38 ไปจนถึง -1.175494351E-38, 0 และ 1.175494351E-38 ถึง 3.402823466E+38...

                    DOUBLE[(M,D)] : ในกรณีที่ต้องการเก็บเลขทศนิยมในระดับที่ละเอียดแบบสุดๆ ไปเลย ก็ต้องเลือกชนิดนี้    เพราะจะเก็บข้อมูลแบบ 64 บิต  สามารถเก็บได้ตั้งแต่ -1.7976931348623157E+308 ถึง -2.2250738585072014E-308, 0 และ 2.2250738585072014E-308   ถึง  1.7976931348623157E+308 

                    DECIMAL[(M,D)] :  เป็นข้อมูลชนิดตัวเลขแบบ unpacked คือ อนุญาตให้สามารถเก็บข้อมูลตัวอักษรเข้าไปได้   
             มีข้อสังเกตนิดนึง เกี่ยวกับข้อมูลชนิด FLOAT, DOUBLE และ DECIMAL ก็คือ
 เวลากำหนดความยาวของข้อมูลในฟิลด์ เราจะกำหนดในรูปแบบ (M,D) ซึ่ง หมายความว่า เราต้องระบุด้วยว่า จะให้มีตัวเลขส่วนที่เป็นจำนวนเต็มกี่หลัก และมีเลขทศนิยมกี่หลัก  เช่น ถ้าเรากำหนดว่า FLOAT(5,2) จะหมายความว่า เราจะเก็บข้อมูลเป็นตัวเลขจำนวนเต็ม 5 หลัก และทศนิยม 2 หลัก      ดังนั้นหากเราใส่ข้อมูล 12345.6789 เข้าไป สิ่งที่จะเข้าไปอยู่ในข้อมูลจริงๆ ก็คือ 12345.68 ครับ (ปัดเศษให้มีจำนวนหลักตามที่เรากำหนด)

                   VARCHAR : เอาไว้เก็บข้อมูลประเภทตัวอักษร   ทุกครั้งที่เลือกชนิดของฟิลด์เป็นประเภทนี้ จะต้องมีการกำหนดความยาวของข้อมูลลงไปด้วย ซึ่งสามารถกำหนดได้ตั้งแต่ 1 - 255 . ฟิลด์ชนิดนี้ เหมาะสำหรับการเก็บข้อมูลสั้นๆ เช่น ชื่อ นามสกุล หรือหัวข้อต่างๆ เป็นต้น   ในส่วนฟิลด์ประเภทนี้ จะสามารถเลือก "แอตทริบิวต์" เป็น BINARY ได้           ปกติแล้วการจัดเรียงข้อมูลเวลาสืบค้น (query) สำหรับ VARCHAR จะเป็นแบบ case-sensitive (ตัวอักษรใหญ่ และเล็กมีความหมายแตกต่างกัน) แต่หากระบุ "แอตทริบิวต์" เป็น BINARY    การสืบค้นจะไม่คำนึงตัวอักษรว่าจะเป็นตัวใหญ่ หรือตัวเล็ก

                  TINYINT : ข้อมูลประเภทตัวเลข    แต่มีขนาดสูงสุดได้แค่ 8 บิต  ข้อมูลประเภทนี้เราสามารถกำหนดเพิ่มเติมในส่วนของ "แอตทริบิวต์" ได้ว่าจะเลือกเป็น UNSIGNED หรือ UNSIGNED ZEROFILL โดยจะมีความแตกต่างดังนี้
                            UNSIGNED : จะหมายถึงเก็บค่าตัวเลขแบบไม่มีเครื่องหมาย ทำให้สามารถเก็บค่าได้ตั้งแต่ 0 - 255
                            UNSIGNED ZEROFILL : เหมือนข้างต้น       แต่ว่าหากข้อมูลที่กรอกเข้ามาไม่ครบตามจำนวนหลักที่เรากำหนด ตัว MySQL จะทำการเติม 0 ให้ครบหลักเองครับ   เช่นเรากำหนดให้ใส่ได้ 3 หลัก แล้วเราเก็บข้อมูล 25 เข้าไป เวลาเราสืบค้นดู เราจะได้ค่าออกมาเป็น 025    หากเราไม่เลือก "แอตทริบิวต์" สิ่งที่เราจะได้ก็คือ SIGNED ครับ นั่นก็คือต้องเสียบิตนึงไปเก็บเครื่องหมาย บวก/ลบ ทำให้สามารถเก็บข้อมูลได้อยู่ในช่วง -128 ถึง 127 เท่านั้น
TEXT : เอาไว้เก็บข้อมูลประเภทตัวอักษร แต่สามารถเก็บได้มากขึ้นครับ โดยสูงสุดคือ 65,535 ตัวอักษร หรือ 64KB นั่นเอง     เหมาะสำหรับเก็บข้อมูลพวกเนื้อหาต่างๆ ที่ยาวๆ 

                  DATE : เอาไว้เก็บข้อมูลประเภทวันที่ โดยเก็บได้จาก 1 มกราคม ค.ศ. 1000 ถึง 31 ธันวาคม ค.ศ. 9999 โดยจะแสดงผลในรูปแบบ YYYY-MM-DD