যেকোনো ডাটাবেসে ডেটা সংরক্ষণের জন্য আমাদের জানতে হয় কোন ধরণের ডেটা কোন ফরম্যাটে রাখা হবে। SQLite-এ ডেটা টাইপ নির্ধারণের পদ্ধতি অন্যান্য ডাটাবেস থেকে একটু আলাদা। এটি ডায়নামিক টাইপ সিস্টেম অনুসরণ করে – অর্থাৎ, কোনো ভ্যালুর ডেটা টাইপ নির্ভর করে ভ্যালুটির নিজস্ব প্রকৃতির ওপর, যে কলামে রাখা হচ্ছে তার ওপর নয়। কোনো কলামে আপনি যেকোনো ধরনের ডেটা রাখতে পারেন। তবুও কর্মক্ষমতা ও বোধগম্যতার জন্য SQLite একটি টাইপ অ্যাফিনিটি ধারণা ব্যবহার করে, যা কলামের “পছন্দের” স্টোরেজ ক্লাস নির্দেশ করে। আজ আমরা SQLite-এর এই সম্পূর্ণ ডেটা টাইপ মেকানিজম উদাহরণসহ বুঝব।
পূর্বপ্রস্তুতি: আপনার সিস্টেমে SQLite ইন্সটল থাকাই যথেষ্ট। কোনো আলাদা প্যাকেজের প্রয়োজন নেই। টার্মিনালে sqlite3 datatype_demo.db কমান্ড দিয়ে একটি ডাটাবেস খুলুন এবং নিচের উদাহরণগুলো অনুসরণ করুন।
১. SQLite স্টোরেজ ক্লাস (Storage Classes)
SQLite ডাটাবেসে সংরক্ষিত প্রতিটি ভ্যালু নিচের পাঁচটি স্টোরেজ ক্লাসের যেকোনো একটিতে পড়ে:
| ক্রমিক | স্টোরেজ ক্লাস | বিবরণ |
|---|---|---|
| 1 | NULL | ভ্যালুটি শূন্য বা অজানা (NULL)। |
| 2 | INTEGER | একটি সাইনড পূর্ণসংখ্যা, মানের আকারের ওপর ভিত্তি করে ১, ২, ৩, ৪, ৬ বা ৮ বাইটে সংরক্ষিত হয়। |
| 3 | REAL | ভাসমান দশমিক সংখ্যা, ৮-বাইট IEEE ফ্লোটিং পয়েন্ট হিসেবে সংরক্ষিত। |
| 4 | TEXT | একটি টেক্সট স্ট্রিং, ডাটাবেস এনকোডিং (UTF-8, UTF-16BE বা UTF-16LE) অনুযায়ী সংরক্ষিত। |
| 5 | BLOB | বাইনারি ডেটা (Binary Large Object), যে আকারে ইনপুট দেওয়া হয় ঠিক সে আকারেই সংরক্ষিত হয়। |
মনে রাখবেন: INTEGER স্টোরেজ ক্লাসের মধ্যেই ছয় রকমের ভিন্ন ভিন্ন দৈর্ঘ্যের ইন্টিজার ধরা হয়। SQLite স্বয়ংক্রিয়ভাবে প্রয়োজনীয় বাইট সাইজ নির্বাচন করে।
উদাহরণ – বিভিন্ন স্টোরেজ ক্লাস পরীক্ষা:
sql
-- টেবিল তৈরি (কোনো টাইপ অ্যাফিনিটি ফোর্স না করেও)
CREATE TABLE test_types (
a,
b,
c,
d,
e
);
INSERT INTO test_types VALUES (NULL, 42, 3.1416, 'হ্যালো', x'DEADBEEF');
এখন SELECT typeof(a), typeof(b), typeof(c), typeof(d), typeof(e) FROM test_types; চালালে আমরা দেখব:
text
typeof(a) typeof(b) typeof(c) typeof(d) typeof(e) ---------- ---------- ---------- ---------- ---------- null integer real text blob
typeof() ফাংশনটি SQLite-তে যেকোনো ভ্যালুর স্টোরেজ ক্লাস বলে দিতে পারে। এটি শেখার কাজে অত্যন্ত উপযোগী।
২. টাইপ অ্যাফিনিটি (Type Affinity)
SQLite-তে আমরা চাইলে কলামের জন্য একটি “প্রস্তাবিত” ডেটা টাইপ উল্লেখ করতে পারি – এটাই টাইপ অ্যাফিনিটি। এর মানে এই নয় যে ওই কলামে শুধু ওই টাইপের ডেটাই রাখা যাবে; বরং SQLite চেষ্টা করে সেই কলামে ঢোকানো ডেটাকে পছন্দের স্টোরেজ ক্লাসে রূপান্তর করতে। প্রতিটি টেবিল কলামের একটি অ্যাফিনিটি থাকে, যা নিচের পাঁচ ধরনের যে কোনো একটি:
| ক্রমিক | অ্যাফিনিটি | আচরণ |
|---|---|---|
| 1 | TEXT | শুধুমাত্র NULL, TEXT বা BLOB স্টোরেজ ক্লাসে ডেটা সংরক্ষণ করে। সংখ্যা দিলে তা টেক্সটে রূপান্তরিত হবে। |
| 2 | NUMERIC | পাঁচটি স্টোরেজ ক্লাসের যেকোনোটি ব্যবহার করতে পারে। সংখ্যা বা দেখতে সংখ্যার মতো স্ট্রিং দিলে তা INTEGER বা REAL-এ রূপান্তরিত হয়। |
| 3 | INTEGER | NUMERIC-এর মতোই, শুধু CAST এক্সপ্রেশনের ক্ষেত্রে কিছুটা ভিন্ন আচরণ করে। (সাধারণত INTEGER প্রাধান্য পায়) |
| 4 | REAL | NUMERIC-এর মতো, তবে পূর্ণসংখ্যাকে জোর করে ফ্লোটিং পয়েন্টে (REAL) রূপান্তর করে। |
| 5 | NONE | কোনো অ্যাফিনিটি নেই। কোনো রূপান্তরের চেষ্টা করা হয় না। ডেটা যেমন দেওয়া হয় তেমনই থাকে। |
সংক্ষেপে: অ্যাফিনিটি হল কলামের “পছন্দ”। যদি আপনি TEXT অ্যাফিনিটির কলামে 123 দেন, সেটি ‘123’ টেক্সটে পরিণত হবে। আর NUMERIC অ্যাফিনিটির কলামে ‘123’ দিলে তা 123 ইন্টিজারে পরিণত হবে।
উদাহরণ – টাইপ অ্যাফিনিটির প্রভাব:
sql
CREATE TABLE affinity_test (
t TEXT,
n NUMERIC,
i INTEGER,
r REAL,
none NONE
);
INSERT INTO affinity_test VALUES
(123, '123', '123', '123', '123'),
('abc', 'abc', 'abc', 'abc', 'abc'),
(45.67, '45.67', 45.67, 45, x'FF');
আউটপুট পরীক্ষা:
sql
SELECT typeof(t), typeof(n), typeof(i), typeof(r), typeof(none) FROM affinity_test;
আপনি দেখবেন:
tকলামে123→textnকলামে'123'→integeriকলামে'123'→integerrকলামে45(পূর্ণসংখ্যা) →real(জোর করে রূপান্তরিত)noneকলামে সবকিছু যেমনি আছে তেমনিই ('123'→text,x'FF'→blobইত্যাদি)
এখানেই SQLite-এর ডায়নামিক নেচার ফুটে ওঠে।
৩. ডেটা টাইপ নাম ও তাদের অ্যাফিনিটি
SQLite-তে টেবিল তৈরি করার সময় আমরা বিভিন্ন পরিচিত ডেটা টাইপ নাম লিখতে পারি, কিন্তু SQLite সেগুলোকে নিজের নিয়মে পাঁচটি অ্যাফিনিটিতে ম্যাপ করে নেয়। নিচের তালিকাটি গুরুত্বপূর্ণ:
| ডেটা টাইপ (আপনি যা লেখেন) | SQLite এর নির্ধারিত অ্যাফিনিটি |
|---|---|
INT, INTEGER, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8 | INTEGER |
CHARACTER(20), VARCHAR(255), VARYING CHARACTER(255), NCHAR(55), NATIVE CHARACTER(70), NVARCHAR(100), TEXT, CLOB | TEXT |
BLOB, কোনো ডেটা টাইপ উল্লেখ না করলে | NONE (বস্তুত BLOB ও NONE একই আচরণ দেখাবে) |
REAL, DOUBLE, DOUBLE PRECISION, FLOAT | REAL |
NUMERIC, DECIMAL(10,5), BOOLEAN, DATE, DATETIME | NUMERIC |
তাই আপনি CREATE TABLE demo (is_active BOOLEAN); লিখলে SQLite এটিকে NUMERIC অ্যাফিনিটি দেবে, এবং আপনি 0/1 বা TRUE/FALSE (যা 1/0 তে রূপান্তর হবে) সংরক্ষণ করতে পারবেন।
৪. বুলিয়ান ডেটা টাইপ
SQLite-তে আলাদা কোনো বুলিয়ান স্টোরেজ ক্লাস নেই। বরং বুলিয়ান ভ্যালু INTEGER আকারে সংরক্ষিত হয়: 0 (মিথ্যা) এবং 1 (সত্য)।
উদাহরণ:
sql
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT,
is_verified BOOLEAN -- আসলে NUMERIC অ্যাফিনিটি
);
INSERT INTO users VALUES (1, 'রাহিম', 1); -- সত্য
INSERT INTO users VALUES (2, 'করিম', 0); -- মিথ্যা
INSERT INTO users VALUES (3, 'সুমন', TRUE); -- SQLite TRUE কীওয়ার্ড বোঝে না, লিখতে গেলে 1
-- ভালো: শুধু 0, 1 ব্যবহার করুন, অথবা CHECK(id IN (0,1)) ব্যবহার করতে পারেন।
চেক কনস্ট্রেইন্ট দিয়ে নিশ্চিত করা:
sql
CREATE TABLE safe_users (
id INTEGER PRIMARY KEY,
is_active INTEGER CHECK(is_active IN (0,1))
);
৫. তারিখ ও সময় ডেটা টাইপ
SQLite-তে কোনো নির্দিষ্ট “Date” বা “Time” স্টোরেজ ক্লাস নেই। কিন্তু এটি তিনটি জনপ্রিয় ফরম্যাটে তারিখ/সময় সংরক্ষণ করতে পারে:
| স্টোরেজ ক্লাস | ফরম্যাট ও ব্যাখ্যা |
|---|---|
| TEXT | স্ট্রিং ফরম্যাট: "YYYY-MM-DD HH:MM:SS.SSS" (ISO 8601) |
| REAL | জুলিয়ান ডে নম্বর: ৪৭১৪ খ্রিস্টপূর্বাব্দের ২৪ নভেম্বর, গ্রিনিচের দুপুর থেকে অতিবাহিত দিনের সংখ্যা। |
| INTEGER | ইউনিক্স টাইমস্ট্যাম্প: ১৯৭০-০১-০১ ০০:০০:০০ UTC থেকে অতিবাহিত সেকেন্ড সংখ্যা। |
SQLite কিছু বিল্ট-ইন ফাংশন সরবরাহ করে যা দিয়ে আপনি এই ফরম্যাটগুলোর মধ্যে রূপান্তর করতে পারবেন: date(), time(), datetime(), julianday(), strftime() ইত্যাদি।
উদাহরণ – বিভিন্ন ফরম্যাটে তারিখ সংরক্ষণ ও পুনরুদ্ধার:
sql
CREATE TABLE events (
id INTEGER PRIMARY KEY,
title TEXT,
event_date_text TEXT, -- "2025-07-10 15:30:00"
event_date_real REAL, -- জুলিয়ান ডে
event_date_int INTEGER -- ইউনিক্স টাইমস্ট্যাম্প
);
-- ধরি একটি ইভেন্ট: ১০ জুলাই ২০২৫, বিকাল ৩:৩০ টায়
INSERT INTO events (title, event_date_text, event_date_real, event_date_int)
VALUES (
'মিটিং',
'2025-07-10 15:30:00',
julianday('2025-07-10 15:30:00'), -- রিয়েল নম্বরে কনভার্ট
strftime('%s', '2025-07-10 15:30:00') -- ইউনিক্স টাইমস্ট্যাম্প
);
-- এখন টেক্সট ফরম্যাটে আবার বের করা:
SELECT
title,
datetime(event_date_real) AS real_to_text,
datetime(event_date_int, 'unixepoch') AS int_to_text
FROM events;
আউটপুটে তিন কলামের মান প্রায় একই দেখাবে। এভাবে আপনি ইচ্ছামতো ফরম্যাটে তারিখ রাখতে ও পড়তে পারেন। সাধারণত TEXT ফরম্যাট (ISO 8601) সবচেয়ে পঠনযোগ্য ও সুবিধাজনক।
তারিখ ফাংশনের কয়েকটি সাধারণ ব্যবহার:
sql
SELECT date('now'); -- আজকের তারিখ
SELECT datetime('now', '+1 day'); -- আগামীকাল এই সময়
SELECT strftime('%Y-%m-%d', 'now'); -- কাস্টম ফরম্যাট
৬. পূর্ণাঙ্গ উদাহরণ: একটি বাস্তব টেবিল তৈরি ও পরীক্ষা
চলুন একটি library টেবিল বানাই যেখানে বিভিন্ন ডেটা টাইপ ও অ্যাফিনিটির ব্যবহার থাকবে।
sql
-- আগের টেবিল থাকলে ডিলিট
DROP TABLE IF EXISTS library;
CREATE TABLE library (
id INTEGER PRIMARY KEY AUTOINCREMENT,
book_name TEXT NOT NULL,
price REAL,
quantity INTEGER DEFAULT 1,
is_available BOOLEAN DEFAULT 1, -- 1 = হ্যাঁ, 0 = না
published_date TEXT, -- YYYY-MM-DD
added_timestamp INTEGER, -- ইউনিক্স টাইম
cover_image BLOB -- ছবি (বাইনারি)
);
-- কিছু বই ইনসার্ট
INSERT INTO library (book_name, price, quantity, is_available, published_date, added_timestamp)
VALUES
('গীতাঞ্জলি', 250.00, 5, 1, '1910-09-01', strftime('%s','now')),
('পথের পাঁচালী', 320.50, 2, 1, '1929-10-01', strftime('%s','now')),
('শেষের কবিতা', 0, 0, 0, '1929-08-01', strftime('%s','now')); -- ফ্রি কিন্তু স্টক নেই
-- দেখা যাক
SELECT book_name, typeof(price), typeof(quantity), typeof(is_available), published_date, datetime(added_timestamp, 'unixepoch') FROM library;
আউটপুটে আপনি দেখতে পাবেন price কলামটি REAL অ্যাফিনিটির, quantity INTEGER, is_available INTEGER, published_date TEXT, আর added_timestamp INTEGER।
৭. ডিরেক্টরি স্ট্রাকচার
আপনি যখন উপরের কমান্ডগুলো রান করবেন, তখন আপনার কাজ করা ফোল্ডারে একটি মাত্র ফাইল তৈরি হবে:
text
your-project-folder/ └── datatype_demo.db
কোনো অতিরিক্ত প্যাকেজ বা কনফিগারেশনের প্রয়োজন নেই। SQLite নিজেই এই ফাইলের ভেতর সব ধরনের ডেটা ও মেটাডেটা দক্ষতার সাথে সংরক্ষণ করে।
পরবর্তী পর্বে
আমরা SQLite-এর CREATE TABLE স্টেটমেন্ট আরও গভীরভাবে শিখব – প্রাইমারি কি, অটোইনক্রিমেন্ট, ফরেন কি, কনস্ট্রেইন্ট (NOT NULL, UNIQUE, CHECK, DEFAULT) ইত্যাদি বিস্তারিত উদাহরণসহ।
লেখকের কথা: SQLite-এর ডেটা টাইপ সিস্টেম সহজ মনে হলেও এর ডায়নামিক আচরণ অনেক সুবিধা দেয়। বাংলায় এই টিউটোরিয়াল সিরিজ চালিয়ে যেতে আপনার ভালোবাসাই বড় অনুপ্রেরণা। পোস্টটি ভালো লাগলে শেয়ার করতে ভুলবেন না, এবং সব আপডেট পেতে আমাদের ব্লগ ToLearnTeam.com ফলো করুন। প্রশ্ন থাকলে কমেন্ট করুন, আমরা উত্তর দিতে প্রস্তুত!
SQLite Full Course
- SQLite পরিচিতি ও ইন্সটলেশন গাইড – বাংলায় প্রথম ডাটাবেস তৈরি
- SQLite কী এবং কেন শিখবেন? সম্পূর্ণ ওভারভিউ ও কমান্ড ক্লাসিফিকেশন (DDL, DML, DQL)
- SQLite ইন্সটলেশন গাইড – Windows, Linux ও Mac-এ ধাপে ধাপে সেটআপ
- SQLite ডট কমান্ড (Dot Commands) – সম্পূর্ণ গাইড, আউটপুট ফরম্যাট ও sqlite_master
- SQLite সিনট্যাক্স (Syntax) – কেস সেনসিটিভিটি, কমেন্ট, সব কমান্ডের গঠন ও উদাহরণ
- SQLite ডেটা টাইপ (Data Type) – স্টোরেজ ক্লাস, টাইপ অ্যাফিনিটি, বুলিয়ান ও ডেট-টাইম
- SQLite ডেটাবেস তৈরি (Create Database) – ধাপে ধাপে গাইড, .dump এক্সপোর্ট ও রিস্টোর
- SQLite ATTACH DATABASE – একাধিক ডাটাবেস সংযুক্ত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DETACH DATABASE – সংযুক্ত ডাটাবেস বিচ্ছিন্ন করার পূর্ণাঙ্গ গাইড
- SQLite CREATE TABLE স্টেটমেন্ট – টেবিল তৈরি করার পূর্ণাঙ্গ গাইড (বাংলা)
- SQLite DROP TABLE স্টেটমেন্ট – টেবিল ডিলিট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite INSERT INTO স্টেটমেন্ট – ডেটা ইনসার্ট করার সম্পূর্ণ গাইড (বাংলা)
- SQLite SELECT স্টেটমেন্ট – টেবিল থেকে ডেটা ফেচ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite অপারেটর (Operators) – Arithmetic, Comparison, Logical, Bitwise (বাংলা টিউটোরিয়াল)
- SQLite এক্সপ্রেশন (Expressions) – বুলিয়ান, নিউমেরিক ও ডেট এক্সপ্রেশন (বাংলা টিউটোরিয়াল)
- SQLite AND ও OR অপারেটর – একাধিক শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite UPDATE Query – টেবিলের ডেটা পরিবর্তন করার সম্পূর্ণ গাইড (বাংলা)
- SQLite DELETE Query – টেবিল থেকে ডেটা মুছে ফেলার সম্পূর্ণ গাইড (বাংলা)
- SQLite LIKE Operator – প্যাটার্ন মিলিয়ে ডেটা খোঁজার সম্পূর্ণ গাইড (বাংলা)
- SQLite GLOB Operator – কেস-সেনসিটিভ প্যাটার্ন মিলিয়ে ডেটা খোঁজা (বাংলা)
- SQLite LIMIT Clause – ডেটা সীমিত করে আনার সম্পূর্ণ গাইড (বাংলা)
- SQLite ORDER BY ক্লজ – ডেটা সাজানোর সম্পূর্ণ গাইড (বাংলা)
- SQLite GROUP BY ক্লজ – ডেটা গ্রুপ করে বিশ্লেষণ করার সম্পূর্ণ গাইড (বাংলা)
- SQLite HAVING ক্লজ – গ্রুপের উপর শর্ত দিয়ে ডেটা ফিল্টার (বাংলা টিউটোরিয়াল)
- SQLite DISTINCT Keyword – ডুপ্লিকেট ডেটা বাদ দিয়ে ইউনিক ভ্যালু পাওয়া (বাংলা)
- SQLite PRAGMA কমান্ড – ডাটাবেস কনফিগারেশন ও সেটিংস (বাংলা টিউটোরিয়াল)
- SQLite Constraints – NOT NULL, DEFAULT, UNIQUE, PRIMARY KEY, CHECK (বাংলা টিউটোরিয়াল)
- SQLite JOINS – CROSS JOIN, INNER JOIN, LEFT OUTER JOIN (বাংলা টিউটোরিয়াল)
- SQLite UNION ও UNION ALL – একাধিক SELECT একত্রিত করার সম্পূর্ণ গাইড (বাংলা)
- SQLite NULL Values – NULL কী, IS NULL, IS NOT NULL (বাংলা টিউটোরিয়াল)
- SQLite ALIAS Syntax – টেবিল ও কলামের অস্থায়ী নাম (বাংলা টিউটোরিয়াল)
- SQLite Triggers – স্বয়ংক্রিয় ট্রিগার তৈরি, ব্যবহার ও মুছে ফেলা (বাংলা টিউটোরিয়াল)
- SQLite Indexes – CREATE, UNIQUE, COMPOSITE, DROP INDEX (বাংলা টিউটোরিয়াল)
- SQLite INDEXED BY Clause – নির্দিষ্ট ইনডেক্স ব্যবহার ও NOT INDEXED (বাংলা)
- SQLite ALTER TABLE Command – টেবিলের গঠন পরিবর্তন (বাংলা টিউটোরিয়াল)
- SQLite TRUNCATE TABLE Command – DELETE ও DROP দিয়ে টেবিল খালি করা (বাংলা)
- SQLite Views – ভার্চুয়াল টেবিল তৈরি, ব্যবহার ও ডিলিট (বাংলা টিউটোরিয়াল)
- SQLite Transactions – BEGIN, COMMIT, ROLLBACK ও ACID প্রপার্টি (বাংলা)
- SQLite Subqueries – SELECT, INSERT, UPDATE, DELETE-এ সাবকোয়েরি ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite AUTOINCREMENT – স্বয়ংক্রিয়ভাবে প্রাইমারি কি মান বৃদ্ধি (বাংলা টিউটোরিয়াল)
- SQLite SQL Injection – কী, কেন বিপজ্জনক ও প্রতিরোধের উপায় (বাংলা টিউটোরিয়াল)
- SQLite EXPLAIN ও EXPLAIN QUERY PLAN – কোয়েরি বিশ্লেষণ (বাংলা টিউটোরিয়াল)
- SQLite VACUUM – ডাটাবেস পরিষ্কার, স্পেস রিক্লেইম ও অটো-ভ্যাকুয়াম (বাংলা টিউটোরিয়াল)
- SQLite Date & Time ফাংশন – date(), time(), datetime(), julianday(), strftime() (বাংলা টিউটোরিয়াল)
- SQLite Useful Functions – COUNT, MAX, MIN, AVG, SUM, RANDOM, ABS, UPPER, LOWER, LENGTH (বাংলা টিউটোরিয়াল)
- SQLite C/C++ প্রোগ্রামিং – sqlite3_open, exec, close, callback (বাংলা টিউটোরিয়াল)
- SQLite PHP প্রোগ্রামিং – PHP-তে SQLite ডাটাবেস ব্যবহার (বাংলা টিউটোরিয়াল)
- SQLite Perl প্রোগ্রামিং – DBI/DBD::SQLite দিয়ে ডাটাবেস অপারেশন (বাংলা)
- SQLite Python প্রোগ্রামিং – sqlite3 মডিউল দিয়ে CRUD অপারেশন (বাংলা টিউটোরিয়াল)
- SQLite Quick Guide – বাংলায় পূর্ণাঙ্গ সংক্ষিপ্ত টিউটোরিয়াল (শেখার সহজ গাইড)
