mysql datatype datafield MySQL 5
หลายคนมักจะเข้าใจ MySQL เพียงพื้นฐานว่ามันสามารถเก็บข้อมูลได้ โดยแบ่งเป็น database > table > field แต่มีไม่มาก ที่จะเข้าใจว่า field นั้น มีหลายแบบ เพราะว่าถ้าเป็นมือใหม่ก็มักจะใช้เพียง varchar ในการเก็บข้อมูลแทบทุกอย่างเลย ซึ่งผลเสียก็คือจะทำให้ database มีขนาดใหญ่โตมากๆ เพื่อใช้ไปนานๆ
เรามาศึกษาเรื่องพื้นฐานกันก่อนจะดีกว่าหรือไม่ เพื่อให้เราสามารถสร้าง database มาเก็บข้อมูลได้ถูกประเภท และประหยัดพื้นที่จัดเก็บข้อมูล ผลพลอยได้ที่ได้ ก็คือทำให้ MySQL ทำงานได้เบาลง และเร็วขึ้นด้วย
โดยทั้งหมดผมจะกล่าวถึง MySQL 5 เป็นหลัก ซึ่ง MySQL 4 ก็น่าจะอ้างอิงได้ในระดับหนึ่งด้วยครับ
datatype mysql เราแบ่งหลักๆได้เป็น 3 ประเภท
- Numeric เอาไว้จัดเก็บตัวเลข
- Date and Time เอาไว้จัดเก็บ วัน , เวลา
- 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) |
ตารางสรุป 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 ไป
อย่างน้อยน่าจะเก็บเอาไว้อ้างอิงกันได้นะครับ อย่างน้อยผมคนนึงล่ะครับ ที่เอาไว้ใช้อ้างอิงตอนที่ต้องการใช้
tag : mysql, datatype, field type, mysql datatype, mysql datafield, mysql field type, mysql storage
