INT, INTEGER, SMALLINT এবং TINYINT এর মতো সম্পর্কিত SQLite ডেটা-টাইপের মধ্যে পার্থক্য কী?


101

এসকিউএলটি 3-তে একটি সারণী তৈরি করার সময়, সমস্ত সম্ভাব্য ডেটাটাইপগুলির সাথে মুখোমুখি হলে আমি বিভ্রান্ত হয়ে পড়ি যা অনুরূপ বিষয়বস্তু বোঝায়, তাই কেউ কি আমাকে নিম্নলিখিত তথ্য-প্রকারের মধ্যে পার্থক্য বলতে পারবেন?

INT, INTEGER, SMALLINT, TINYINT

DEC, DECIMAL

LONGCHAR, LONGVARCHAR

DATETIME, SMALLDATETIME

কোথাও এমন কিছু ডকুমেন্টেশন রয়েছে যা মিনিট / ম্যাক্স তালিকাভুক্ত করে। বিভিন্ন ডেটা-টাইপের সক্ষমতা? উদাহরণস্বরূপ, আমি অনুমান করি যে এর smallintচেয়ে বৃহত্তর সর্বাধিক মান tinyint, তবে পূর্ণসংখ্যার চেয়ে ছোট মান রয়েছে তবে এই ক্ষমতাগুলি কী তা সম্পর্কে আমার কোনও ধারণা নেই।

উত্তর:


95

SQLite, প্রযুক্তিগতভাবে, কোনও ডেটা প্রকার নেই, ম্যানিফেস্টে টাইপিং সিস্টেমে স্টোরেজ ক্লাস রয়েছে এবং হ্যাঁ, আপনি যদি গতানুগতিক RDBMSএস ব্যবহার করেন তবে এটি বিভ্রান্তিকর । অভ্যন্তরীণভাবে সমস্ত কিছুই পাঠ্য হিসাবে সঞ্চিত থাকে। অ্যাফিলিটিগুলির ভিত্তিতে ডেটা প্রকারগুলি জোর করে / বিভিন্ন স্টোরেজ স্থানে রূপান্তরিত করা হয় (কলামগুলিতে নির্ধারিত আলা ডাটা টাইপ)।

আমি আপনাকে সেরা পরামর্শ দিচ্ছি তা হ'ল:

  1. স্বতন্ত্র ডাটাবেস ডেটাটাইপগুলি সম্পর্কে আপনি জানার জন্য সমস্ত কিছু অস্থায়ীভাবে ভুলে যান

  2. SQLiteসাইট থেকে উপরের লিঙ্কটি পড়ুন ।

  3. আপনার পুরানো স্কিমার ভিত্তিতে প্রকারগুলি নিন এবং দেখুন তারা কী ম্যাপ করে SQLite

  4. সমস্ত SQLiteডেটাবেস ডেটাবেসে স্থানান্তরিত করুন ।

দ্রষ্টব্য: ডেটাটাইপ সীমাবদ্ধতাগুলি জটিল হতে পারে, বিশেষত যদি আপনি সময়সীমা, বা তারিখগুলি বা সেই প্রকৃতির জিনিসগুলি যুক্ত করেন SQLSQLiteএই ধরণের জিনিসটির জন্য খুব কম বিল্ট-ইন ফাংশন রয়েছে। তবে লাইব্রেরি ফাংশনের SQLiteমাধ্যমে আপনার সময়সীমা এবং প্রকৃতির জিনিসগুলি যুক্ত করার জন্য আপনার নিজের অন্তর্নির্মিত ফাংশনগুলি তৈরি করার সহজ উপায় সরবরাহ করে না sqlite3_create_function। আপনি facilityতিহ্যবাহী সঞ্চিত পদ্ধতির জায়গায় সেই সুবিধাটি ব্যবহার করবেন।


1
উত্তর এবং লিঙ্কের জন্য ধন্যবাদ। এর অর্থ কি এই যে আমি মৌলিক ধরণের পাঠ্য, সংখ্যাসূচক, পূর্ণসংখ্যা, আসল, কোনওটির সাথেই আটকে থাকি? আমার কাছে খুব সীমাবদ্ধ বলে মনে হচ্ছে, বিশেষত একটি এমএসএসকিউএল, ফক্সপ্রো এবং ওরাকল পটভূমি থেকে আসা। শুভেচ্ছা।
অ্যালান হ্যারিস-রিড

6
আমি আপনার সাথে একমত, এটি প্রথমে সীমাবদ্ধ বলে মনে হয় না। তবে আমি মনে করি আপনি এসকিউএলাইট খুব সহজে ক্ষমা করছেন যে আপনি কীভাবে ডেটাবেজে ডেটা ডাটাবেসে রেখেছেন তার সুনির্দিষ্টতা সিস্টেমের মাধ্যমে। এসকিউএলাইট একক নয় - এটি কোডের একটি ডাটাবেস অ্যাক্সেস এপিআইয়ের মাধ্যমে অ্যাক্সেস করার জন্য আপনি ছোট অ্যাপ্লিকেশনগুলিতে রেখে একটি সামান্য ডাটাবেস ব্যাকএন্ড হতে ডিজাইন করেছেন। এসকিউএলাইটে সমস্যা সমাধান করা সাধারণত তারা কীভাবে এটি করতে চান তা নির্ধারণের বিষয়।
জে। পোল্ফার

আমি বেসিক ধরনের আটকে থাকতাম।
জে। পলফার

4
@Alan: আপনি এটি উপযোগী করে সাংখ্যিক-সম্বন্ধ কলাম ডিক্লেয়ার পেতে পারে DATEবা BOOLEAN, কিন্তু আমি পূর্ণসংখ্যার বিভিন্ন মাপের মধ্যে পার্থক্য বিরক্ত না। এটি বিশেষত ক্ষেত্রে INTEGER PRIMARY KEYক্ষেত্রে সঠিক, একমাত্র ক্ষেত্রে যেখানে সঠিক নামটির বিষয়টি গুরুত্বপূর্ণ।
dan04

"সমস্ত কিছু পাঠ্য হিসাবে সঞ্চিত আছে" sqlite.org/fileformat.html অনুসারে ভুল বলে মনে হচ্ছে , যা বলেছে সংখ্যাগুলি কমপ্যাক্ট বার্নিশ / ফ্ল্যাট 64 হিসাবে সংরক্ষণ করা হয় এবং কেবল ব্লব এবং পাঠ্য স্ট্রিং হিসাবে সংরক্ষণ করা হয়
ফিরস্কি

47

পার্থক্য সিনট্যাকটিক চিনি। প্রকারের সম্পর্কের ক্ষেত্রে কেবলমাত্র নামের কয়েকটি সাবস্ট্রিংগুলি বিবেচনা করে।

  • INT, INTEGER, SMALLINT, TINYINT T INTEGER affinity, কারণ এগুলি সবগুলিতে "INT" রয়েছে।
  • লংচর, লংগারচার EXT পাঠের সখ্যতা, কারণ এগুলিতে "CHAR" রয়েছে contain
  • ডিসি, ডিসিমাল, ডেটটাইম, স্মলডিটেটটাইম → ম্যাসেরিক, কারণ এগুলিতে যে কোনও সাবস্ট্রিং থাকে না সেগুলি গুরুত্বপূর্ণ।

সম্বন্ধ নির্ধারণের জন্য বিধিমালা এ তালিকাভুক্ত করা হয় SQLite সাইটে

আপনি যদি কঠোর টাইপিংয়ের জন্য জেদ করেন, তবে আপনি এটিকে CHECKবাধা দিয়ে বাস্তবায়ন করতে পারেন :

CREATE TABLE T (
   N   INTEGER CHECK(TYPEOF(N) = 'integer'),
   Str TEXT CHECK(TYPEOF(Str) = 'text'),
   Dt  DATETIME CHECK(JULIANDAY(Dt) IS NOT NULL)
);

তবে আমি এটি নিয়ে কখনই মাথা ঘামাই না।

প্রতিটি ধরণের ক্ষমতা হিসাবে:

  • INTEGERসর্বদা স্বাক্ষরিত হয় 64-বিট। নোট SQLite সেরা অনুকূল রূপ দেয় যে স্টোরেজ , পর্দার পেছনের ছোট পূর্ণসংখ্যার তাই TINYINT দরকারী যাহাই হউক না কেন হবে না।
  • REAL সর্বদা 64৪ বিট (double ) হয়।
  • TEXTএবং BLOBএকটি আছে সর্বোচ্চ আকার 1.000.000.000 বাইট একটি প্রাক প্রসেসর ম্যাক্রো দ্বারা নির্ধারিত, যা অক্ষমতা।

1
দুর্দান্ত কৌশল। দয়া করে মনে রাখবেন এই পদ্ধতির কি প্রয়োজন নেই একটি মান-টু-করা সন্নিবেশিত / এক হিসাবে একই স্টোরেজ ক্লাস আছে আপডেট করা TYPEOF। সুতরাং, একটি পাঠ্য সন্নিবেশ করার চেষ্টা করা হয়েছে যা অন্যথায় এসকিউলাইট দ্বারা NUMERIC / INTEGER স্টোরেজ শ্রেণিতে রূপান্তরিত হবে (যেমন, sqlite.org/datatype3.html#affinity অনুসারে এই ধরণের রূপান্তরটি ক্ষতিহীন ) would অন্য কথায় এই পদ্ধতির মান সন্নিবেশ করার অ্যাড-হক পদ্ধতির চেয়ে কঠোর এবং তারপরে কোনও উপায়ে এসকিউএলাইট দ্বারা সেই মানটি সঞ্চয় করতে ব্যবহৃত স্টোরেজ ক্লাসটিকে যাদুতে বৈধভাবে প্রমাণ করতে হবে। আরও অনুমতিপ্রাপ্ত পদ্ধতির জন্য নীচে আমার উত্তরটি দেখুন।

10

যাদের বেশিরভাগই সামঞ্জস্যতার জন্য রয়েছে। আপনার কাছে কেবলমাত্র পূর্ণসংখ্যা, ভাসা, পাঠ্য এবং ব্লব রয়েছে। তারিখগুলি সংখ্যা হিসাবে (ইউনিক্স সময় পূর্ণসংখ্যা, মাইক্রোসফ্ট সময় ভাসমান) বা পাঠ্য হিসাবে সংরক্ষণ করা যেতে পারে।


আমি এটি ওয়েবভিত্তিক প্রকল্পগুলির জন্য ব্যবহার করেছি যেখানে শেষ পর্যন্ত সবকিছুই এইচটিএমএল পৃষ্ঠাতে পাঠ্য হওয়া পর্যন্ত শেষ হয়েছিল। আমি প্রচুর ডেটা রূপান্তর করে এবং বেশিরভাগ কলামের জন্য কেবল পাঠ্য ব্যবহার করেছি। এটি ভাল কাজ করেছে।
জে

3

NULL। মানটি একটি নুল মান।

INTEGER। মান হ'ল একটি স্বাক্ষরিত পূর্ণসংখ্যা, মানটির পরিমাণের উপর নির্ভর করে 1, 2, 3, 4, 6, বা 8 বাইটে সঞ্চিত হয়।

REAL। মানটি একটি ভাসমান পয়েন্টের মান, একটি 8-বাইট আইইইই ফ্লোটিং পয়েন্ট নম্বর হিসাবে সঞ্চিত।

TEXT। মান হ'ল একটি পাঠ্য স্ট্রিং, ডাটাবেস এনকোডিং (UTF-8, UTF-16BE বা UTF-16LE) ব্যবহার করে সঞ্চিত।

BLOB। মান হ'ল ডেটা ফোলা, ঠিক যেমনটি ইনপুট ছিল তাই সংরক্ষণ করা হয়।


1

Dan04 থেকে উত্তর যুক্ত করার জন্য, আপনি যদি অন্ধভাবে NUMERICশূন্য ব্যতীত অন্য কোনও দ্বারা representedোকাতে চান TEXTতবে নিশ্চিত করুন যে পাঠ্যটি সংখ্যায় রূপান্তরিত হয়:

your_numeric_col NUMERIC CHECK(abs(your_numeric_col) <> 0)

সাধারণ ব্যবহারের ক্ষেত্রটি এমন কোনও প্রোগ্রামের প্রশ্নের মধ্যে রয়েছে যা সমস্ত তথ্যকে পাঠ্য হিসাবে বিবেচনা করে (অভিন্নতা এবং সরলতার জন্য, যেহেতু এসকিউএলাইট ইতিমধ্যে এটি করেছে)। এ সম্পর্কে দুর্দান্ত জিনিসটি এটি এর মতো নির্মাণের অনুমতি দেয়:

INSERT INTO table (..., your_numeric_column, ...) VALUES (..., some_string, ...)

যা আপনি স্থানধারক ব্যবহার করছেন সে ক্ষেত্রে সুবিধাজনক কারণ আপনাকে এ জাতীয় শূন্য-সংখ্যার ক্ষেত্র বিশেষভাবে পরিচালনা করতে হবে না। পাইথনের sqlite3মডিউল ব্যবহার করার উদাহরণ হ'ল ,

conn_or_cursor.execute(
    "INSERT INTO table VALUES (" + ",".join("?" * num_values) + ")",   
    str_value_tuple)  # no need to convert some from str to int/float

উপরের উদাহরণে, str_value_tupleএসকিউলাইটে পাস করার পরে সমস্ত মানগুলি পালিয়ে যাবে এবং স্ট্রিং হিসাবে উদ্ধৃত হবে। তবে, যেহেতু আমরা স্পষ্টভাবে টাইপের মাধ্যমে প্রকারটি পরীক্ষা করছি না TYPEOFতবে কেবল টাইপের রূপান্তরযোগ্যতা , এটি এখনও পছন্দসই হিসাবে কাজ করবে (যেমন, এসকিউএলাইট হয় এটি একটি সংখ্যা হিসাবে সংরক্ষণ করবে বা অন্যথায় ব্যর্থ হবে)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.