Data Type কেন দরকার?
একটা স্কুলের অফিসে আলাদা আলাদা ড্রয়ার আছে — একটায় শিক্ষার্থীর আইডি কার্ড, একটায় বই, একটায় টাকা, একটায় সার্টিফিকেট রাখা হয়।
❓ সব কিছু কি একই ড্রয়ারে রাখা যায়?
রাখা যায়, কিন্তু তখন টাকার মধ্যে বই খুঁজে পাওয়া দুঃস্বপ্ন হয়ে যাবে।
❓ এতে কী সমস্যা হবে?
জিনিস হারিয়ে যাওয়া, ভুল জিনিস তুলে ফেলা, সময় নষ্ট হওয়া।
ঠিক এই একই কারণে, ডেটাবেজেও প্রতিটা কলামকে আগে থেকেই বলে দিতে হয় সেখানে কোন ধরনের তথ্য থাকবে — সংখ্যা, লেখা, তারিখ, নাকি হ্যাঁ/না। এটাই SQL Data Type।
একজন শিক্ষার্থীর নাম কি যোগ-বিয়োগ করা যায়? না। একটা ফোন নম্বরকে কি সংখ্যা হিসেবে গণনা করা উচিত? না, কারণ শুরুতে ০ থাকতে পারে। প্রতিটা ডেটার নিজস্ব প্রকৃতি অনুযায়ী সঠিক Data Type বেছে নিলে তবেই ডেটাবেজ নির্ভুল ও দ্রুত কাজ করে।
Data Type কী?
সংজ্ঞা: Data Type হলো একটা নিয়ম, যা নির্ধারণ করে একটা কলামে কী ধরনের তথ্য (সংখ্যা, লেখা, তারিখ ইত্যাদি) রাখা যাবে, তা কতটুকু জায়গা নেবে, এবং তার ওপর কী ধরনের অপারেশন (যোগ, তুলনা) করা যাবে।
কেন গুরুত্বপূর্ণ:
| প্রভাব | ব্যাখ্যা |
|---|---|
| সংরক্ষণ (Storage) | সঠিক Data Type কম জায়গা নেয়, ভুল টাইপ অপ্রয়োজনীয় জায়গা নষ্ট করে |
| গতি (Speed) | সঠিক টাইপে খোঁজা ও হিসাব করা দ্রুত হয় |
| সঠিকতা (Accuracy) | ভুল টাইপ ব্যবহার করলে ভুল হিসাব বা ভুল ফলাফল আসতে পারে |
| ডেটা | সঠিক Data Type | কারণ |
|---|---|---|
| শিক্ষার্থীর নাম | VARCHAR | এটা লেখা, গণনা করার প্রয়োজন নেই |
| বয়স | INT | এটা পূর্ণসংখ্যা, হিসাব-নিকাশ করা যেতে পারে |
| GPA | DECIMAL/FLOAT | এটা দশমিক সংখ্যা |
| জন্মতারিখ | DATE | এটা একটা নির্দিষ্ট বিন্যাসের তারিখ |
| ফি পরিশোধ হয়েছে কিনা | BOOLEAN | এটা শুধু হ্যাঁ/না |
সাংখ্যিক (Numeric) Data Type
পূর্ণসংখ্যা (Integer) ধরনসমূহ
এদের মধ্যে পার্থক্য হলো এরা কত বড় সংখ্যা রাখতে পারে এবং কতটুকু জায়গা নেয়।
| টাইপ | জায়গা নেয় | মোটামুটি রেঞ্জ (ধারণাগত) | বাস্তব উদাহরণ |
|---|---|---|---|
| TINYINT | খুবই কম | ছোট সংখ্যা (০-২৫৫ এর কাছাকাছি) | বয়স, ছোট কাউন্ট |
| SMALLINT | কম | মাঝারি ছোট সংখ্যা | প্রোডাক্ট কোয়ান্টিটি |
| MEDIUMINT | মাঝারি | মাঝারি সংখ্যা | শহরের জনসংখ্যা |
| INT | স্ট্যান্ডার্ড | বড় সংখ্যা | শিক্ষার্থী আইডি, সাধারণ গণনা |
| BIGINT | বেশি | অত্যন্ত বড় সংখ্যা | ব্যাংক ট্রানজেকশন আইডি, জনসংখ্যা গণনা |
শুধু "বয়স" রাখতে হলে TINYINT-ই যথেষ্ট (কারণ বয়স কখনো অনেক বড় সংখ্যা হয় না), কিন্তু একটা দেশের মোট জনসংখ্যা রাখতে হলে BIGINT দরকার হতে পারে। ছোট প্রয়োজনে বড় টাইপ ব্যবহার করলে অপ্রয়োজনীয় জায়গা নষ্ট হয়।
দশমিক সংখ্যা (Decimal Numbers)
| টাইপ | বৈশিষ্ট্য | উদাহরণ |
|---|---|---|
| FLOAT | আনুমানিক দশমিক মান, দ্রুত কিন্তা সামান্য অনির্ভুল হতে পারে | বৈজ্ঞানিক পরিমাপ |
| DOUBLE | FLOAT-এর চেয়ে বেশি নির্ভুল, কিন্তু বেশি জায়গা নেয় | উচ্চ-নির্ভুলতার পরিমাপ |
| DECIMAL | সম্পূর্ণ নির্ভুল, টাকার হিসাবের জন্য সেরা | প্রোডাক্টের দাম, ব্যাংক ব্যালেন্স |
DECIMAL ব্যবহার করা উচিত।প্রোডাক্টের দাম রাখতে DECIMAL(10,2) ব্যবহার হয় — এর মানে সর্বোচ্চ ১০ ডিজিট রাখা যাবে, যার মধ্যে ২টা দশমিকের পরে।
লেখা (String) Data Type
| টাইপ | বৈশিষ্ট্য | উদাহরণ |
|---|---|---|
| CHAR(n) | ফিক্সড দৈর্ঘ্য — সবসময় n অক্ষরের জায়গা নেয়, কম লিখলেও বাকিটা ফাঁকা থাকে | দেশের কোড (যেমন "BD") |
| VARCHAR(n) | ভ্যারিয়েবল দৈর্ঘ্য — যতটুকু লেখা হয় ততটুকুই জায়গা নেয়, সর্বোচ্চ n পর্যন্ত | নাম, ঠিকানা |
| TEXT | অনেক বড় লেখার জন্য (কয়েক হাজার অক্ষর পর্যন্ত) | প্রোডাক্ট বর্ণনা |
| LONGTEXT | অত্যন্ত বড় লেখার জন্য (কোটি অক্ষর পর্যন্ত) | একটা সম্পূর্ণ বইয়ের লেখা |
CHAR বনাম VARCHAR
CHAR অনেকটা একটা নির্দিষ্ট মাপের বাক্সের মতো — সবসময় একই আকার, ভেতরে কম জিনিস থাকলেও বাক্সের আকার বদলায় না। VARCHAR অনেকটা একটা প্রসারণযোগ্য ব্যাগের মতো — যতটুকু জিনিস, ততটুকুই জায়গা নেয়।
| বিষয় | CHAR | VARCHAR |
|---|---|---|
| দৈর্ঘ্য | সবসময় নির্দিষ্ট | প্রয়োজন অনুযায়ী পরিবর্তনশীল |
| জায়গা ব্যবহার | নির্দিষ্ট মাপ, ছোট মান হলেও একই জায়গা নেয় | প্রয়োজন অনুযায়ী জায়গা নেয়, সাধারণত সাশ্রয়ী |
| গতি | নির্দিষ্ট দৈর্ঘ্যের ডেটায় সামান্য দ্রুত হতে পারে | সাধারণ ব্যবহারে ভালো ভারসাম্য |
| উপযুক্ত ব্যবহার | সবসময় একই দৈর্ঘ্যের ডেটা (যেমন দেশের কোড) | পরিবর্তনশীল দৈর্ঘ্যের ডেটা (যেমন নাম) |
CHAR vs VARCHAR — স্টোরেজ দেখো
টেক্সট লিখে CHAR(10) ও VARCHAR(10)-এ কীভাবে জায়গা নেয় তা তুলনা করো।
তারিখ ও সময় (Date & Time) Data Type
| টাইপ | রাখে | বিন্যাস | উদাহরণ |
|---|---|---|---|
| DATE | শুধু তারিখ | YYYY-MM-DD | জন্মতারিখ, পরীক্ষার তারিখ |
| TIME | শুধু সময় | HH:MM:SS | লগইন সময় |
| DATETIME | তারিখ ও সময় একসাথে | YYYY-MM-DD HH:MM:SS | অর্ডার করার মুহূর্ত |
| TIMESTAMP | তারিখ ও সময়, সাধারণত স্বয়ংক্রিয়ভাবে আপডেট হয় | YYYY-MM-DD HH:MM:SS | রেকর্ড শেষ কবে পরিবর্তিত হলো |
| YEAR | শুধু বছর | YYYY | পাসের সাল |
জন্মতারিখের জন্য শুধু DATE যথেষ্ট (সময় জানার দরকার নেই)। কিন্তু একটা অর্ডার ঠিক কোন মুহূর্তে হয়েছে তা জানতে DATETIME বা TIMESTAMP দরকার। TIMESTAMP প্রায়ই স্বয়ংক্রিয়ভাবে "এই রেকর্ড শেষ কখন পরিবর্তন হয়েছে" তা ট্র্যাক করতে ব্যবহার হয়।
🎂 জন্মদিন
DATE ব্যবহার করা উচিত
🔑 লগইন সময়
TIME বা DATETIME ব্যবহার করা উচিত
📝 পরীক্ষার তারিখ
DATE ব্যবহার করা উচিত
🛒 অর্ডার সময়
DATETIME ব্যবহার করা উচিত
অন্যান্য সাধারণ Data Type
✅ BOOLEAN
রাখে: শুধু TRUE/FALSE (হ্যাঁ/না)।
ফি পরিশোধ হয়েছে কিনা, অ্যাকাউন্ট সক্রিয় কিনা।
📋 ENUM
রাখে: আগে থেকে নির্ধারিত কয়েকটা নির্দিষ্ট মানের মধ্যে একটা।
লিঙ্গ ('Male', 'Female', 'Other'), সাইজ ('Small', 'Medium', 'Large')।
🖼️ BLOB (ধারণাগত)
রাখে: বাইনারি ডেটা, যেমন ছবি, অডিও বা ফাইল সরাসরি ডেটাবেজে।
শিক্ষার্থীর প্রোফাইল ছবি সরাসরি ডেটাবেজে সংরক্ষণ (যদিও বাস্তবে প্রায়ই আলাদা ফাইল স্টোরেজ ব্যবহার করা হয়)।
🗂️ JSON (ধারণাগত)
রাখে: কাঠামোবদ্ধ কিন্তু নমনীয় তথ্য, যেখানে প্রতিটা রেকর্ডে ভিন্ন ভিন্ন ফিল্ড থাকতে পারে।
একটা প্রোডাক্টের বিভিন্ন ধরনের অতিরিক্ত বৈশিষ্ট্য (রঙ, সাইজ, ওজন) একসাথে নমনীয়ভাবে রাখা।
সঠিক Data Type বেছে নেওয়া
আমরা একটা Students টেবিল ডিজাইন করবো — প্রতিটা কলামের জন্য সঠিক Data Type বেছে নেবো।
| কলাম | সঠিক Data Type | কারণ |
|---|---|---|
| Student ID | INT (AUTO_INCREMENT) | পূর্ণসংখ্যা, স্বয়ংক্রিয়ভাবে বাড়তে পারে |
| Name | VARCHAR(50) | পরিবর্তনশীল দৈর্ঘ্যের লেখা |
| Gender | ENUM('Male','Female','Other') | নির্দিষ্ট কয়েকটা মানের একটা |
| Date of Birth | DATE | শুধু তারিখ, সময় দরকার নেই |
| GPA | DECIMAL(3,2) | নির্ভুল দশমিক সংখ্যা (যেমন ৫.০০) |
| VARCHAR(100) | পরিবর্তনশীল দৈর্ঘ্যের লেখা | |
| Phone Number | VARCHAR(15) | শুরুতে ০ থাকতে পারে, গণনার প্রয়োজন নেই |
| Admission Date | DATE | শুধু তারিখ |
| IsActive | BOOLEAN | হ্যাঁ/না মান |
Type Matcher — সঠিক Data Type বেছে নাও
প্রতিটা কলাম সিনারিওর জন্য সঠিক টাইপ ট্যাপ করো।
Wrong-type Trap — ফোন নম্বর INT না VARCHAR?
ফোন নম্বর INT হিসেবে রাখলে কী ভেঙে যায়, নিজে চেষ্টা করে দেখো।
MySQL Workbench প্র্যাকটিক্যাল সেশন
ধাপ ১: Database তৈরি
ধাপ ২: বিভিন্ন Data Type সহ Students টেবিল তৈরি
ধাপ ৩: নমুনা রেকর্ড যোগ করা
ধাপ ৪: টেবিলের কাঠামো দেখা
| Field | Type |
|---|---|
| student_id | int |
| name | varchar(50) |
| gpa | decimal(3,2) |
| admission_date | date |
| is_active | tinyint(1) |
ব্যাখ্যা: লক্ষ্য করো, MySQL-এ BOOLEAN আসলে ভেতরে ভেতরে tinyint(1) হিসেবে সংরক্ষিত হয় — TRUE মানে ১, FALSE মানে ০।
ধাপ ৫: ডেটা দেখা
| student_id | name | gpa | admission_date | is_active |
|---|---|---|---|---|
| 1 | নাবিলা | 4.85 | 2026-01-15 | 1 |
- DECIMAL(3,2)-এ ৫.০০-এর বেশি মান দেওয়ার চেষ্টা করলে এরর আসতে পারে (সর্বোচ্চ ৩ ডিজিট, ২টা দশমিকের পরে)
- তারিখ ভুল বিন্যাসে দেওয়া (যেমন 15-01-2026 এর বদলে সঠিক হলো 2026-01-15)
সাধারণ শুরুর ভুল
✅ সমাধান: সংখ্যা, তারিখ, হ্যাঁ/না — প্রতিটার জন্য উপযুক্ত টাইপ বেছে নাও।
✅ সমাধান: টাকার জন্য সবসময় DECIMAL ব্যবহার করো।
✅ সমাধান: ডেটার সম্ভাব্য সর্বোচ্চ মান বিবেচনা করে TINYINT/INT/BIGINT বাছো।
✅ সমাধান: নির্দিষ্ট দৈর্ঘ্যের ডেটায় CHAR, পরিবর্তনশীল দৈর্ঘ্যে VARCHAR ব্যবহার করো।
✅ সমাধান: তারিখের জন্য DATE/DATETIME ব্যবহার করো, যাতে তারিখ নিয়ে হিসাব-নিকাশ সহজ হয়।
✅ সমাধান: ছোট লেখার জন্য VARCHAR-ই যথেষ্ট, শুধু অনেক বড় লেখার জন্য TEXT ব্যবহার করো।
✅ সমাধান: শুধু দুইটা সম্ভাব্য মান (হ্যাঁ/না) থাকলেই BOOLEAN ব্যবহার করো, তিন বা তার বেশি অপশন থাকলে ENUM ভাবো।
ইন্ডাস্ট্রি বেস্ট প্র্যাকটিস
💾 স্টোরেজ অপ্টিমাইজেশন
প্রয়োজনের চেয়ে বড় Data Type ব্যবহার না করে জায়গা সাশ্রয় করা
⚡ পারফরম্যান্স অপ্টিমাইজেশন
সঠিক টাইপ ব্যবহার করলে খোঁজা ও হিসাব দ্রুত হয়
📈 স্কেলেবিলিটি
ভবিষ্যতে ডেটা বাড়লেও যেন সমস্যা না হয় তা মাথায় রেখে টাইপ বাছাই
👓 পঠনযোগ্যতা
টাইপ দেখেই বোঝা যাবে কলামে কী ধরনের তথ্য আছে
🛠️ ভবিষ্যৎ রক্ষণাবেক্ষণ
সঠিক টাইপ বেছে নিলে পরে পরিবর্তন করার প্রয়োজন কম পড়ে
ক্লাসরুম অ্যাক্টিভিটি
রিভিশন ও প্রশ্নোত্তর
📌 দ্রুত রিভিশন নোট
- Data Type ঠিক করে কোন কলামে কী ধরনের তথ্য থাকবে
- Numeric: TINYINT থেকে BIGINT (পূর্ণসংখ্যা), FLOAT/DOUBLE/DECIMAL (দশমিক)
- String: CHAR (ফিক্সড), VARCHAR (ভ্যারিয়েবল), TEXT/LONGTEXT (বড় লেখা)
- Date & Time: DATE, TIME, DATETIME, TIMESTAMP, YEAR
- অন্যান্য: BOOLEAN, ENUM, BLOB, JSON
- টাকার জন্য সবসময় DECIMAL, কখনো FLOAT না
🧠 সম্পূর্ণ Data Type মাইন্ড ম্যাপ
🕰️ SQL Data Type-এর সংক্ষিপ্ত ইতিহাস
শুরুর দিকের ডেটাবেজ সিস্টেমে শুধু মৌলিক সংখ্যা ও লেখা টাইপ ছিলো। সময়ের সাথে ব্যবসার চাহিদা বাড়ায় (ছবি, ফাইল, নমনীয় কাঠামো সংরক্ষণের প্রয়োজন) আধুনিক ডেটাবেজে BLOB, JSON, XML-এর মতো টাইপ যুক্ত হয়েছে। আজকের SQL Data Type ব্যবস্থা এত বিস্তৃত যে প্রায় যেকোনো ধরনের বাস্তব-জগতের তথ্য যথাযথভাবে সংরক্ষণ করা সম্ভব।
📊 তুলনামূলক টেবিলসমূহ
| বিষয় | FLOAT | DOUBLE | DECIMAL |
|---|---|---|---|
| নির্ভুলতা | কম | মাঝারি-বেশি | সম্পূর্ণ নির্ভুল |
| জায়গা | কম | বেশি | মাঝারি-বেশি |
| ব্যবহার | বৈজ্ঞানিক আনুমানিক মান | উচ্চ-নির্ভুলতার হিসাব | টাকা, আর্থিক হিসাব |
| বিষয় | DATE | DATETIME | TIMESTAMP |
|---|---|---|---|
| রাখে | শুধু তারিখ | তারিখ+সময় | তারিখ+সময় |
| স্বয়ংক্রিয় আপডেট | না | না | প্রায়ই হ্যাঁ |
| ব্যবহার | জন্মতারিখ | অর্ডার সময় | রেকর্ড পরিবর্তনের সময় |
| বিষয় | TEXT | LONGTEXT |
|---|---|---|
| ধারণক্ষমতা | কয়েক হাজার অক্ষর | কোটি অক্ষর পর্যন্ত |
| ব্যবহার | প্রোডাক্ট বর্ণনা | সম্পূর্ণ বই/আর্টিকেলের লেখা |
🛒 মিনি প্রজেক্ট: E-commerce Product টেবিল
লক্ষ্য করো, প্রতিটা কলামে ডেটার প্রকৃতি অনুযায়ী সবচেয়ে উপযুক্ত টাইপ বেছে নেওয়া হয়েছে — দাম DECIMAL, বর্ণনা TEXT, ক্যাটাগরি ENUM।
👥 প্রফেশনাল ওয়ার্কফ্লো
পারফরম্যান্স ও স্টোরেজ বিবেচনায় টাইপ নির্বাচনে পরামর্শ দেন
টেবিল ডিজাইনে সঠিক Data Type প্রয়োগ করেন
ডেটার টাইপ বুঝে সঠিক বিশ্লেষণ পদ্ধতি বেছে নেন
❓ ভাইভা প্রশ্ন
💼 ইন্টারভিউ প্রস্তুতি — টপ ৩০টি বিগিনার লেভেল প্রশ্ন
✅ MCQ প্র্যাকটিস
(ক) FLOAT (খ) DECIMAL (গ) VARCHAR (ঘ) BOOLEAN
(ক) VARCHAR (খ) TEXT (গ) CHAR (ঘ) BLOB
(ক) TIME (খ) DATE (গ) DATETIME (ঘ) YEAR
(ক) BOOLEAN (খ) ENUM (গ) INT (ঘ) FLOAT
(ক) VARCHAR (খ) TEXT (গ) TINYINT(1) (ঘ) DATE
📝 হোমওয়ার্ক অ্যাসাইনমেন্ট
- একটা "Library Management System"-এর Books টেবিলের জন্য প্রতিটা কলামের সঠিক Data Type বেছে নাও (book_id, title, author, price, published_date, is_available)।
- Data Type মাইন্ড ম্যাপ (Numeric, String, Date & Time, Boolean, Binary/BLOB, JSON) নিজ হাতে এঁকে প্রতিটার নিচে একটা করে নিজের উদাহরণ লেখো।
- CHAR vs VARCHAR, FLOAT vs DECIMAL, DATE vs DATETIME — এই তিনটা পার্থক্য নিজের ভাষায় মোট ৬টা বাক্যে লেখো।