এসকিউএল-এ ডেটা টাইপের ভূমিকা
জাভাস্ক্রিপ্টের বিপরীতে, SQL এর শক্তিশালী টাইপিং আছে। প্রতিটি টেবিলে, প্রতিটি কলামের নিজস্ব নির্দিষ্ট ডেটা টাইপ রয়েছে।
অনেকগুলি ডেটা টাইপ আছে, কিন্তু জাভা ভাষার বিপরীতে, সেগুলির মধ্যে অনেকগুলি নেই কারণ সমস্ত অনুষ্ঠানের জন্য ডেটা প্রকার রয়েছে৷ ডেটাবেসগুলি ডেটার আকারের উপর খুব নির্ভরশীল, তাই অনেকগুলি ডেটা টাইপ একে অপরের থেকে শুধুমাত্র দৈর্ঘ্যে পৃথক।
মোট, ডেটা প্রকারগুলিকে 5 টি গ্রুপে ভাগ করা যায়:
- সংখ্যাসূচক প্রকার
- স্ট্রিং প্রকার
- তারিখ এবং সময় সংরক্ষণের জন্য প্রকার
- অবজেক্ট: সাধারণত বাইটের সংগ্রহ হিসাবে উপস্থাপিত হয়
- পরিবহন : JSON এবং XML
সাধারণত বিভিন্ন DBMS এর নিজস্ব ডেটা টাইপ থাকে। প্রতিটি DBMS এর নিজস্ব স্পেশালাইজেশন আছে, তাই নতুন ডাটা টাইপ যোগ করা খুবই সাধারণ ব্যাপার।
আরেকটি বিষয় হল যে শুধুমাত্র একটি নতুন ডেটা টাইপ যোগ করা যথেষ্ট নয়, আপনাকে এটির সাথে কাজ করবে এমন ফাংশন যোগ করতে হবে, পাশাপাশি এই কাজটিকে সুবিধাজনক এবং দ্রুত করে তুলবে।
আপনি যদি কোনও শিল্প (এন্টারপ্রাইজ) ডিবিএমএসে কাজ করেন তবে সম্ভবত আপনাকে এর ডেটা প্রকার এবং এর ফাংশনগুলি মোকাবেলা করতে হবে। কিসের জন্য 2-5টা ভালো বই পড়তে হবে।
এসকিউএল-এর সাথে আমাদের পরিচিতির অংশ হিসাবে, আমরা ডেটা প্রকারের তিনটি প্রধান গ্রুপ বিবেচনা করব:
- সংখ্যা
- স্ট্রিংস
- তারিখগুলি
এসকিউএল-এ সংখ্যাসূচক প্রকার
এসকিউএল-এ, সংখ্যাসূচক প্রকারগুলি তিনটি গ্রুপে বিভক্ত:
- পূর্ণসংখ্যার ধরন
- স্থির বিন্দু সংখ্যা (দশমিক স্থানের নির্দিষ্ট সংখ্যা)
- ফ্লোটিং পয়েন্ট সংখ্যা
পূর্ণসংখ্যা দিয়ে শুরু করা যাক । তাদের মধ্যে মাত্র 5টি রয়েছে এবং সেগুলি একটি টেবিলে বর্ণনা করা যেতে পারে:
# | নাম টাইপ করুন | বাইটে দৈর্ঘ্য | জাভা থেকে অ্যানালগ | সর্বনিম্ন মান | সর্বোচ্চ মূল্য |
---|---|---|---|---|---|
1 | TINYINT | 1 | বাইট | -128 | 127 |
2 | ছোট | 2 | সংক্ষিপ্ত | -32.768 | 32.767 |
3 | মাঝারি | 3 | -8,388,608 | ৮,৩৮৮,৬০৭ | |
4 | আইএনটি | 4 | int | -2,147,483,648 | 2,147,483,647 |
5 | বড় | 8 | দীর্ঘ | -২ ৬৩ | 2 63-1 |
ডাটা টাইপগুলি জাভা ডাটা টাইপের সাথে খুব মিল, তবে একটি পূর্ণসংখ্যার ধরনও রয়েছে যা তিন বাইট দীর্ঘ। এটি আকার সংরক্ষণ করার জন্য করা হয়.
এরপরে ফ্লোটিং পয়েন্টের ধরনগুলি আসে , ঠিক জাভাতে, তাদের মধ্যে কেবল দুটি রয়েছে:
# | নাম টাইপ করুন | বাইটে দৈর্ঘ্য | জাভা থেকে অ্যানালগ | সর্বনিম্ন মান | সর্বোচ্চ মূল্য |
---|---|---|---|---|---|
1 | ভাসা | 4 | ভাসা | -3.40E+38 | +1.18E+38 |
2 | দ্বিগুণ | 8 | দ্বিগুণ | -1.79E+308 | +1.79E+308 |
আবার, নতুন কিছু না. সবকিছু জাভার মত একই। যাইহোক, জাভা থেকে ভিন্ন, এসকিউএল-এর আরেকটি বিশেষ ধরন আছে, ফিক্সড-পয়েন্ট রিয়েল নম্বর। এটাকে ডেসিমাল বলা হয়।
সাধারণত এই ধরনের অর্থের পরিমাণ সঞ্চয় করতে ব্যবহৃত হয়। যখন এই ধরণের নাম লেখা হয়, তখন এটির পরে সাধারণত দশমিক বিন্দুর আগে এবং পরে সংখ্যাটির কত দশমিক স্থান রয়েছে তা নির্দেশ করা হয়। সাধারণ বিন্যাস এই মত দেখায়:
DECIMAL(total_characters, after_comma)
এবং একটি ছোট উদাহরণ:
salary DECIMAL(5,2)
এইভাবে আমরা বর্ণনা করেছি যে বেতন কলামে পূর্ণসংখ্যা (সর্বোচ্চ 3 দশমিক স্থান) এবং একটি ভগ্নাংশ - 2 দশমিক স্থান থাকতে পারে।
DECIMAL প্রকার সমর্থন করে এমন অক্ষরের সর্বাধিক সংখ্যা হল 65।
এসকিউএল-এ স্ট্রিং প্রকার
একটি ডাটাবেসের সারি দুটি আকারে সংরক্ষণ করা যেতে পারে:
- নির্দিষ্ট দৈর্ঘ্যের স্ট্রিং
- পরিবর্তনশীল দৈর্ঘ্য সহ স্ট্রিং
স্থির-দৈর্ঘ্যের স্ট্রিংগুলিকে CHAR হিসাবে নির্দিষ্ট করা হয়েছে :
CHAR(length)
স্থির দৈর্ঘ্য মানে এই কলামের সমস্ত মান কঠোরভাবে নির্দিষ্ট সংখ্যক অক্ষর ধারণ করবে।
একটি নির্দিষ্ট দৈর্ঘ্যের স্ট্রিংয়ের উদাহরণ:
country_code CHAR(2)
পরিবর্তনশীল দৈর্ঘ্যের স্ট্রিং VARCHAR প্রকার দ্বারা নির্দিষ্ট করা হয় :
VARCHAR(max_length)
পরিবর্তনশীল দৈর্ঘ্য মানে এই কলামের সমস্ত মান যেকোনো দৈর্ঘ্যের পাঠ্য ধারণ করবে, তবে সর্বাধিক দৈর্ঘ্যের বেশি নয়।
পরিবর্তনশীল দৈর্ঘ্য স্ট্রিং উদাহরণ:
phone VARCHAR(12)
নির্দিষ্ট দৈর্ঘ্য স্ট্রিং একটি খুব বড় সুবিধা আছে. ক্লায়েন্ট যদি এসকিউএল সার্ভারকে টেবিল থেকে 1,000,000 তম সারিটি তার কাছে ফেরত দিতে বলে এবং টেবিলের সারিগুলি নির্দিষ্ট দৈর্ঘ্যের হয়, তাহলে, সারির দৈর্ঘ্য জেনে, আপনি সহজেই কাঙ্ক্ষিত বাইটের সাথে সম্পর্কিত বাইটগুলি গণনা করতে পারেন সারি
লাইনের পরিবর্তনশীল দৈর্ঘ্যের ক্ষেত্রে, টেবিলে পছন্দসই সারিটি দ্রুত খুঁজে পাওয়া সম্ভব হবে না। ArrayList এবং LinkedList-এ অ্যাক্সেসের গতি মনে রাখবেন, পরিস্থিতি এখানে প্রায় একই রকম।
ডেটা টাইপের উপর নির্ভর করে একটি টেবিলে বিভিন্ন দৈর্ঘ্যের স্ট্রিংগুলি কীভাবে সংরক্ষণ করা হবে তা তুলনা করা যাক।
লাইন | CHAR(4) | স্টোর করার জন্য বাইট | ভার্চার(4) | স্টোর করার জন্য বাইট | |
---|---|---|---|---|---|
' | ' | 4 | ' | 1 | |
'এবি' | 'এবি' | 4 | 'এবি' | 3 | |
'এ বি সি ডি' | 'এ বি সি ডি' | 4 | 'এ বি সি ডি' | 5 | |
'abcdefgh' | 'এ বি সি ডি' | 4 | 'এ বি সি ডি' | 5 |
বিঃদ্রঃ. VARCHAR প্রকারের একই দৈর্ঘ্যের জন্য আরও একটি বাইট প্রয়োজন, কারণ এটি অতিরিক্তভাবে স্ট্রিংয়ের দৈর্ঘ্য সংরক্ষণ করতে হবে।
এসকিউএল-এ অস্থায়ী প্রকার
তারিখ এবং সময় সঞ্চয় করার জন্য SQL এরও বিশেষ প্রকার রয়েছে। মোট পাঁচ প্রকার আছে:
# | নাম টাইপ করুন | Java DateTime API থেকে অ্যানালগ | উদাহরণ | সর্বনিম্ন মান | সর্বোচ্চ মূল্য |
---|---|---|---|---|---|
1 | তারিখ | স্থানীয় তারিখ | '2022-06-30' | '1000-01-01' | '9999-12-31' |
2 | টাইম | স্থানীয় সময় | 'hh:mm:ss[.fraction]' | '-838:59:59.000000' | '838:59:59.000000' |
3 | তারিখ সময় | স্থানীয় তারিখের সময় | '1000-01-01 00:00:00.000000' | '9999-12-31 23:59:59.999999' | |
4 | টাইমস্ট্যাম্প | তারিখ | '1970-01-01 00:00:01.000000' | '2038-01-19 03:14:07.999999' | |
5 | বছর | 1901 | 2155 |
প্রশ্নের সমস্ত ডেটা একটি স্ট্রিং হিসাবে লেখা হয় - একক উদ্ধৃতিতে। এন্ট্রি বিন্যাসটি বৃহত্তম থেকে ছোটে যায়:
- বছর
- মাস
- দিন
- ঘন্টা
- মিনিট
- দ্বিতীয়
- এক সেকেন্ডের ভগ্নাংশ
DATE, TIME এবং DATETIME প্রকারগুলিকে প্রচলিতভাবে জাভা DateTme API থেকে প্রকারের অ্যানালগ হিসাবে বিবেচনা করা যেতে পারে: LocalDate, LocalTime, LocalDateTime৷ যুক্তি প্রায় একই.
TIMESTAMP টাইপ 1970 এর শুরু থেকে মিলিসেকেন্ডে ডেটা সঞ্চয় করে (একটি UNIX অপারেটিং সিস্টেমের মান)। এই ফর্মে তারা জাভা ভাষায় তারিখের ধরন দ্বারা সংরক্ষণ করা হয়।
এবং অবশেষে, YEAR প্রকার আছে, যা 1 বাইট দীর্ঘ এবং 1 থেকে 255 পর্যন্ত মান সঞ্চয় করে। অতএব, এটির জন্য উপলব্ধ বছরের পরিসীমা হল 1901-2155। 1900 সাল এই ধরনের দ্বারা সংরক্ষণ করা যাবে না, যেহেতু মান 0 একটি NULL মান এনকোড করতে ব্যবহৃত হয়।
SQL-এ বস্তু সংরক্ষণ করা
বড় দৈর্ঘ্যের বস্তু বা পাঠ্য সংরক্ষণের জন্য বিশেষ ধরনের আছে। আমরা তাদের সম্পর্কে বিশদে যাব না, তবে আমি তাদের তালিকা করব:
# | নাম টাইপ করুন | ব্যাখ্যা |
---|---|---|
1 | টেক্সট | দীর্ঘ টেক্সট সংরক্ষণ করতে ব্যবহৃত. এই ক্ষেত্রে তুলনা এবং বাছাই করার সময়, শুধুমাত্র প্রথম 100টি অক্ষর ব্যবহার করা হয়। |
2 | BLOB | নামটির অর্থ হল বাইট লার্জ অবজেক্ট। বাইটের সংগ্রহ হিসাবে সংরক্ষিত। উদাহরণস্বরূপ, একটি ডাটাবেসে ছবি সংরক্ষণ করতে ব্যবহার করা যেতে পারে। |
3 | CLOB | নামটি চার বড় বস্তুর জন্য দাঁড়িয়েছে। দীর্ঘ টেক্সট সংরক্ষণ করতে ব্যবহৃত. |
4 | ENUM | আপনাকে মানগুলির একটি নির্দিষ্ট সেট সেট করতে এবং সেগুলির একটিকে একটি মান হিসাবে সংরক্ষণ করার অনুমতি দেয়। |
5 | সেট | আপনাকে মানগুলির একটি নির্দিষ্ট সেট সেট করতে এবং সেগুলির যেকোনো উপসেটকে একটি মান হিসাবে সংরক্ষণ করার অনুমতি দেয়। সাধারণত এগুলিকে বাইনারি মাস্ক হিসাবে সংরক্ষণ করে। |
তাত্ত্বিকভাবে, আপনি যেকোন জাভা অবজেক্টকে বাইটের সেট হিসেবে সিরিয়ালাইজ করতে পারেন এবং ডাটাবেসে BLOB হিসেবে সংরক্ষণ করতে পারেন। বস্তু সংরক্ষণ একটি সমস্যা নয়. তার সঙ্গে আরও কীভাবে কাজ করবেন?
ধরা যাক একটি টেবিল ক্রমিক আকারে এক মিলিয়ন বস্তু সঞ্চয় করে - আপনি কিভাবে তাদের মাধ্যমে অনুসন্ধান করবেন? একটি DBMS শুধুমাত্র একটি নির্দিষ্ট ধরণের ডেটা সমর্থন করে যখন এটি এটির সাথে কাজ করার জন্য ফাংশনের একটি বিস্তৃত সেট প্রদান করে।