Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
MySQL + SQL · Lesson 35

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 के आकार जैसा है, ताकि सिर्फ़ सही चीज़ अंदर फ़िट हो।

💡 Note

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 / DOUBLEApproximate decimalScientific / sensor readings

DECIMAL(10,2) का मतलब है: कुल 10 अंक, जिनमें से 2 दशमलव के बाद। तो सबसे बड़ी value 99999999.99 है। जब भी पैसे की बात हो, यही type उठाइए।

⚠️ पैसे के लिए FLOAT कभी न लें

0.1 जैसी value FLOAT में पूरी तरह सही नहीं रखी जा सकती। ऐसी कई values जोड़िए और छोटी-छोटी गलतियाँ इकट्ठा हो जाती हैं, तो जो bill 100.00 होना चाहिए वह 99.9998 दिख सकता है। जिसे आप जोड़ेंगे या currency की तरह दिखाएँगे, उसके लिए DECIMAL लें।

String types (CHAR, VARCHAR, TEXT)

String types text रखते हैं। रोज़ काम आने वाले दो हैं CHAR और VARCHAR, और फ़र्क length का है।

TypeLength व्यवहारकिसके लिए सही
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) का number limit है, reservation नहीं

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सिर्फ़ date2026-06-01
TIMEसिर्फ़ time14:30:00
DATETIMEDate + time, बड़ी year range2026-06-01 14:30:00
TIMESTAMPDate + time, 1970-2038, time-zone aware2026-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 उस असली चीज़ से मेल खाता है जो वह रखता है।

MySQL
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;
Output:
+---------+--------------+-------+----------+------------+---------------------+
| 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 देते हैं।

🏋️ Practice

एक 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 नहीं हो सकती। असली DATE type लें।
  • आदत से हर चीज़ 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 — याद रहे TIMESTAMP 2038 में ख़त्म होता है।
  • सबसे छोटा 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 में क्या फ़र्क है?
दोनों date और time रखते हैं। 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 नहीं।
अगर मैं column की limit से बड़ी value insert करूँ तो क्या होगा?
strict mode में (MySQL 8 का default) insert error के साथ रुक जाता है, जो आपके data को बचाता है। पुराने या ढीले mode में MySQL चुपचाप value को काट सकता है — जैसे लंबी string को छोटा कर देना या number को अधिकतम पर रोक देना — जिससे छिपा हुआ data loss हो सकता है।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.
अगला topicCREATE DATABASE और CREATE TABLE आपकी प्रगति: 35 / 151 (23%) · Lesson 36 / 151 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें