MySQL Data Types
Data type क्यों ज़रूरी है
MySQL table के हर column का एक data type होता है। यह एक वादा है कि वह column किस तरह की value रखेगा — पूरी संख्या, कीमत, name, date, वग़ैरह। यह एक फ़ैसला चुपचाप तीन चीज़ें तय करता है: हर row कितनी disk जगह लेगी, आपकी query कितनी तेज़ चलेगी, और क्या ग़लत data अंदर घुस सकता है।
एक school database सोचिए। अगर आप student की fee को साधारण text में रखते हैं, तो MySQL ख़ुशी-ख़ुशी "abc" को भी fee मान लेगा। पर अगर वह column DECIMAL(10,2) घोषित हो, तो ग़लत value दरवाज़े पर ही रुक जाती है और हर कीमत पैसे तक सही रहती है। यही data type का असली काम है — यह container के आकार जैसा है, ताकि सिर्फ़ सही चीज़ अंदर फ़िट हो।
MySQL अपने types को तीन व्यावहारिक परिवारों में बाँटता है: numeric, string और date/time। अगर आप हर परिवार का एक अच्छा उदाहरण समझ लें, तो लगभग हर असली table संभाल सकते हैं।
Numeric types (INT, DECIMAL, FLOAT)
Numeric types संख्याएँ रखते हैं, पर ये आपस में बदले नहीं जा सकते। मुख्य बँटवारा है exact types (INT, DECIMAL) और approximate types (FLOAT, DOUBLE) के बीच।
| Type | क्या रखता है | किसके लिए सही |
|---|---|---|
| TINYINT | छोटी पूर्ण संख्याएँ (0-255 unsigned) | Flag, age, status code |
| INT | ~2.1 अरब तक पूर्ण संख्याएँ | ID, roll number, गिनती |
| BIGINT | बहुत बड़ी पूर्ण संख्याएँ | Views, बड़े counter |
| DECIMAL(p,s) | तय scale वाले exact decimal | पैसा, fees, marks |
| FLOAT / DOUBLE | Approximate decimal | Scientific / sensor readings |
DECIMAL(10,2) का मतलब है: कुल 10 अंक, जिनमें से 2 दशमलव के बाद। तो सबसे बड़ी value 99999999.99 है। जब भी पैसे की बात हो, यही type उठाइए।
0.1 जैसी value FLOAT में पूरी तरह सही नहीं रखी जा सकती। ऐसी कई values जोड़िए और छोटी-छोटी गलतियाँ इकट्ठा हो जाती हैं, तो जो bill 100.00 होना चाहिए वह 99.9998 दिख सकता है। जिसे आप जोड़ेंगे या currency की तरह दिखाएँगे, उसके लिए DECIMAL लें।
String types (CHAR, VARCHAR, TEXT)
String types text रखते हैं। रोज़ काम आने वाले दो हैं CHAR और VARCHAR, और फ़र्क length का है।
| Type | Length व्यवहार | किसके लिए सही |
|---|---|---|
| CHAR(n) | Fixed - हमेशा n अक्षर, space से भरा | तय size के code (state code "UP", "MH") |
| VARCHAR(n) | Variable - जितना चाहिए उतना, n तक | Name, email, address |
| TEXT | बड़ा variable text, अलग रखा जाता है | Comment, remarks, description |
CHAR तभी लें जब value सच में तय चौड़ाई की हो। 2 अक्षर का state code इसके लिए बिल्कुल सही है। student के name के लिए — जो 3 या 30 अक्षर का हो सकता है — VARCHAR कोई जगह बर्बाद नहीं करता। TEXT सिर्फ़ तब लें जब लंबे paragraph की उम्मीद हो, क्योंकि इसमें default value नहीं हो सकती और index धीमा होता है।
VARCHAR(50) हर row के लिए 50 अक्षर की जगह नहीं पकड़ता। यह बिल्कुल उतना ही रखता है जितना आप डालते हैं, साथ में length के लिए एक-दो byte। तो VARCHAR(255) column में छोटा name बर्बादी नहीं — 255 सिर्फ़ आपकी अनुमति दी गई अधिकतम सीमा है।
Date और time types
MySQL में date और time के लिए ख़ास types हैं, जो उन्हें साधारण string में रखने से कहीं बेहतर है। असली date type आपको समय के क्रम में sort करने, range comparison करने और DATEDIFF() जैसे date functions इस्तेमाल करने देता है।
| Type | क्या रखता है | उदाहरण |
|---|---|---|
| DATE | सिर्फ़ date | 2026-06-01 |
| TIME | सिर्फ़ time | 14:30:00 |
| DATETIME | Date + time, बड़ी year range | 2026-06-01 14:30:00 |
| TIMESTAMP | Date + time, 1970-2038, time-zone aware | 2026-06-01 14:30:00 |
जन्म तिथि या admission date के लिए DATE लें। किसी event का ठीक समय चाहिए और बड़ी range चाहिए तो DATETIME। जब MySQL से "created at" या "updated at" अपने-आप भरवाना हो तो TIMESTAMP — पर याद रखिए यह 2038 में रुक जाता है, इसलिए भविष्य की planning dates के लिए नहीं।
पूरा CREATE TABLE उदाहरण
यहाँ एक छोटी students table है जो हर परिवार का एक type काम में लाती है। ध्यान दीजिए कैसे हर column का type उस असली चीज़ से मेल खाता है जो वह रखता है।
CREATE TABLE students (
roll_no INT PRIMARY KEY, -- पूर्ण संख्या ID
name VARCHAR(50) NOT NULL, -- variable-length text
state CHAR(2), -- तय 2 अक्षर का code
fees DECIMAL(10,2), -- exact money value
dob DATE, -- सिर्फ़ date
joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO students (roll_no, name, state, fees, dob)
VALUES (1, 'Aarav Sharma', 'UP', 12500.00, '2008-04-15');
SELECT * FROM students;+---------+--------------+-------+----------+------------+---------------------+
| roll_no | name | state | fees | dob | joined_at |
+---------+--------------+-------+----------+------------+---------------------+
| 1 | Aarav Sharma | UP | 12500.00 | 2008-04-15 | 2026-06-01 14:30:00 |
+---------+--------------+-------+----------+------------+---------------------+
देखिए कैसे fees ने अपने दो दशमलव अंक रखे और joined_at ने DEFAULT CURRENT_TIMESTAMP की वजह से ख़ुद को अपने-आप भर लिया। हर value सही आकार के container में गिरी।
सही type कैसे चुनें
जब असमंजस हो, value के बारे में तीन तेज़ सवाल पूछिए:
- क्या यह एक number है जिस पर गणित होगी? पूर्ण संख्या के लिए
INT, पैसे और marks के लिएDECIMAL। - क्या यह बदलती लंबाई का text है?
VARCHARलें। सिर्फ़ तय-चौड़ाई code के लिएCHAR, और लंबे paragraph के लिएTEXT। - क्या यह date या time है?
DATE,DATETIMEयाTIMESTAMP— कभी string नहीं, ताकि date functions चलते रहें।
एक और नियम: सबसे छोटा type चुनिए जो आराम से आपके data में फ़िट हो। जो status flag सिर्फ़ 0 या 1 है उसे INT की ज़रूरत नहीं; TINYINT चौथाई जगह में काम कर देता है। लाखों rows में ऐसे छोटे फ़ैसले मिलकर असली speed देते हैं।
एक products table बनाइए जिसमें id, product name, price और "created at" time के column हों। SQL लिखने से पहले हर column का type तय कीजिए, फिर table बनाइए। किस column को आपने DECIMAL बनाया, और FLOAT क्यों नहीं?
आम गलतियाँ
- पैसे के लिए FLOAT लेना। एक row पर ठीक लगता है और चुपचाप total बिगाड़ देता है। currency के लिए हमेशा
DECIMAL। - Date को VARCHAR में रखना। "01-06-2026" जैसी string date सही से sort या compare नहीं हो सकती। असली
DATEtype लें। - आदत से हर चीज़ VARCHAR(255) बना देना। चलता है, पर आपके data का असली आकार छिपा देता है और ग़लत value अंदर आने देता है। type को meaning से मिलाइए।
- दूर भविष्य की dates के लिए TIMESTAMP। यह 2038 पर रुक जाता है। उससे आगे की dates के लिए
DATETIMEलें।
सारांश
- MySQL types तीन परिवारों में हैं: numeric, string, और date/time।
- पूर्ण संख्याओं के लिए
INTऔर पैसे व marks के लिएDECIMAL— currency के लिएFLOATकभी नहीं। - ज़्यादातर text के लिए
VARCHAR, तय-चौड़ाई code के लिए हीCHAR, लंबे content के लिएTEXT। - समय के लिए
DATE,DATETIMEयाTIMESTAMP— याद रहेTIMESTAMP2038 में ख़त्म होता है। - सबसे छोटा type चुनिए जो फ़िट हो; यह जगह बचाता है और query तेज़ करता है।
आगे, इन columns को नियमों से और सुरक्षित करना सीखिए MySQL में constraints से, या देखिए tables कैसे जुड़ती हैं primary और foreign key से।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
MySQL में पैसे (money) के लिए कौन-सा data type लें?
DECIMAL लें (जैसे DECIMAL(10,2))। यह value को बिल्कुल सही रखता है, तो 19.99 हमेशा 19.99 ही रहता है। पैसे के लिए FLOAT या DOUBLE कभी न लें, क्योंकि ये approximate value रखते हैं और छोटी-छोटी rounding गलतियाँ total व bill में जुड़ती चली जाती हैं।CHAR और VARCHAR में क्या अंतर है?
CHAR(n) हमेशा fixed length इस्तेमाल करता है और छोटी value के आगे space जोड़ देता है, इसलिए यह उन values के लिए अच्छा है जो हमेशा एक ही size की हों, जैसे 2 अक्षर का state code। VARCHAR(n) सिर्फ़ उतनी ही जगह लेता है जितनी value को चाहिए, इसलिए name, email और बदलती लंबाई वाली चीज़ों के लिए बेहतर है।DATETIME और TIMESTAMP में क्या फ़र्क है?
DATETIME value को वैसे ही रखता है जैसे आपने डाला और इसकी year range बहुत बड़ी है। TIMESTAMP अंदर से UTC में रखा जाता है, session time zone के हिसाब से बदलता है और current time auto-update कर सकता है — पर यह सिर्फ़ 1970 से 2038 तक चलता है, इसलिए बहुत आगे की dates के लिए ठीक नहीं।क्या छोटे name के लिए VARCHAR(255) जगह बर्बाद करता है?
VARCHAR सिर्फ़ उतने ही अक्षर रखता है जितने आपने डाले, साथ में length के लिए 1-2 byte। तो VARCHAR(255) column में 5 अक्षर का name लगभग उतनी ही जगह लेता है जितनी VARCHAR(20) में। bracket वाला number सिर्फ़ अधिकतम limit है, पहले से रिज़र्व किया गया block नहीं।