mysql datatype datafield MySQL 5

mysql datatype datafield MySQL 5

หลายคนมักจะเข้าใจ MySQL เพียงพื้นฐานว่ามันสามารถเก็บข้อมูลได้ โดยแบ่งเป็น database > table > field แต่มีไม่มาก ที่จะเข้าใจว่า field นั้น มีหลายแบบ เพราะว่าถ้าเป็นมือใหม่ก็มักจะใช้เพียง varchar ในการเก็บข้อมูลแทบทุกอย่างเลย ซึ่งผลเสียก็คือจะทำให้ database มีขนาดใหญ่โตมากๆ เพื่อใช้ไปนานๆ

เรามาศึกษาเรื่องพื้นฐานกันก่อนจะดีกว่าหรือไม่ เพื่อให้เราสามารถสร้าง database มาเก็บข้อมูลได้ถูกประเภท และประหยัดพื้นที่จัดเก็บข้อมูล ผลพลอยได้ที่ได้ ก็คือทำให้ MySQL ทำงานได้เบาลง และเร็วขึ้นด้วย

โดยทั้งหมดผมจะกล่าวถึง MySQL 5 เป็นหลัก ซึ่ง MySQL 4 ก็น่าจะอ้างอิงได้ในระดับหนึ่งด้วยครับ

datatype mysql เราแบ่งหลักๆได้เป็น 3 ประเภท 

  1. Numeric เอาไว้จัดเก็บตัวเลข
  2. Date and Time เอาไว้จัดเก็บ วัน , เวลา
  3. String เอาไว้จัดเก็บ ตัวหนังสือ ตัวอักษรต่างๆ

ตารางสรุป Numeric

ประเภท Numeric  ขนาดข้อมูลที่เก็บได้  ขนาดพื้นที่ ที่ใช้
 tinyint [unsigned]  [signed] -128 ถึง 127
[unsigned] 0 ถึง 255
 1 bytes
 smallint [unsigned] [signed] -32768 ถึง 32767
[unsigned] 0 ถึง 65535
 2 bytes
 mediumint [unsigned] [signed] -8,388,608 ถึง 8,388,607 
[unsigned] 0 ถึง 16,777,215
 3 bytes
 int [unsigned]
integer [unsigned]
[signed] -2,147,483,648 ถึง 2,147,483,647 
[unsigned] 0 ถึง 4,294,967,295
 4 bytes
 bigint [unsigned] [signed] -9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807 
[unsigned] 0 ถึง 18,446,744,073,709,551,615
 8 bytes
 float [unsigned] [signed]   -3.402823466E+38 ถึง -1.175494351E-38, 0, และ 1.175494351E-38 ถึง 3.402823466E+38
[unsigned] จะไม่มีค่าเป็นลบ
 4 bytes
 double [unsigned] [signed]-1.7976931348623157E+308 ถึง -2.2250738585072014E-308, 0, และ 2.2250738585072014E-308 ถึง1.7976931348623157E+308.
[unsigned] จะไม่มีค่าลบ 
 8 bytes
 decimal [M]  ค่าที่ระบุจำนวนตัวเลขที่ต้องการเก็บ เช่น [M] คือ 30 ก็เก็บเลขได้ 30 หลัก (ตั้งแต่ MySQL 5.0.3) สูงสุดที่ 30 หลัก  (M+7)/8
 bit [M] ใส่ค่า bit ใส่ได้ ตั้งแต่ 1 ถึง 64 (ตั้งแต่ 5.0.3)  
สำหรับ unsigned คือไม่มีเครื่องหมาย หรือเป็นแบบไม่มีค่าติดลบนั่นเองครับ แต่ว่าปกติที่เราสร้างfield จะถูกกำหนดเป็น signed โดยอัตโนมัติครับ

ตารางสรุป Date and Time

ประเภท Date Time ขนาดข้อมูลที่เก็บได้  ขนาดพื้นที่ ที่ใช้
 date  เก็บวันเดือนปี ใน format 'YYYY-MM-DD' อยู่ในช่วง '1000-01-01' ถึง '9999-12-31' 3 bytes
 time เก็บเวลา ใน format 'HH:MM:SS'  3 bytes
 datetime เก็บ วัน เดือน ปี เวลา ใน format  'YYYY-MM-DD HH:MM:SS' อยู่ในช่วง '1000-01-01 00:00:00' ถึง '9999-12-31 23:59:59'  8 bytes
 timestamp เก็บ วัน เดือน ปี เวลา ใน format 'YYYY-MM-DD HH:MM:SS' อยู่ในช่วง '1970-01-01 00:00:01' UTC ถึง '2038-01-19 03:14:07' UTC ซึ่งเป็นวินาที ที่มีจุดเริ่มต้นตั้งแต่ '1970-01-01 00:00:00'  4 bytes
 year [2|4] เก็บ ปี ใน format 'YYYY' ถ้า 2 จะเก็บแค่ 2 ตัวท้าย ถ้า 4 จะเก็บเต็ม 4 ตัว  1 bytes

ตารางสรุป String

ประเภท String ขนาดข้อมูลที่เก็บได้  ขนาดพื้นที่ ที่ใช้
 CHAR[(M)]  เก็บตัวหนังสือ ตั้งแต่ 0 - 255 ตัว (M)  M bytes
 BINARY(M) เหมือน char แต่ เก็บเป็น binary string  M bytes
 varchar(M) เก็บตัวหนังสือ 0 - 255 ถ้า MySQL > 5.0.3 เก็บได้ 0- 65,535 ตัวอักษร  L+1,L+2 bytes
 tinytext เก็บตัวหนังสือ 0 - 255 ตัว  L+1 bytes
 text เก็บตัวหนังสือ 0 - 65,535 ตัว  L+2 bytes
mediumtext เก็บตัวหนังสือ 0 - 16,777,215 ตัว  L+3 bytes
 longtext เก็บตัวหนังสือ 0 - 4,294,967,295 ตัว  L+4 bytes
 enum เก็บค่าที่กำหนดเอง ใช้พื้นที่ 1 หรือ 2 bytes  ไม่เกิน 65535

L คือตัวอักษรที่ใช้จริง

จะเห็นได้ว่า enum เป็นการเก็บ sting ได้น่าสนใจมาก เพราะว่าหากเก็บไม่เกิน 255 แบบ ก็จะใช้เพียง 1 bytes เท่านั้น ส่วน set ลองลงมา เราอาจจะเอามาเป็น field เก็บจังหวัด อำเภอได้อย่างสบาย โดยที่ไม่เปลือง database เลย ส่วนการเก็บ sting ที่รับมาจาก user ก็ใช้เป็น varchar หรือ พวก text ไป

อย่างน้อยน่าจะเก็บเอาไว้อ้างอิงกันได้นะครับ อย่างน้อยผมคนนึงล่ะครับ ที่เอาไว้ใช้อ้างอิงตอนที่ต้องการใช้

Create: Modify : 2010-08-16 09:19:31 Read : 10083 URL :