এসকিউএলাইটে বুলিয়ান মান সঞ্চয় করুন


284

এসকিউএলাইটে বিওওএল মানের প্রকারটি কী? আমি আমার টেবিলে সত্য / মিথ্যা মান সংরক্ষণ করতে চাই।

আমি INTEGER এর একটি কলাম তৈরি করতে এবং এতে 0 বা 1 এর মান সংরক্ষণ করতে পারি তবে এটি BOOL প্রকারটি কার্যকর করার সেরা উপায় হবে না।

কোন উপায় আছে?

ধন্যবাদ।


উত্তর:


365

এসকিউএলাইটের জন্য কোনও দেশীয় বুলিয়ান ডেটা টাইপ নেই। প্রতি Datatypes ডক :

এসকিউএলাইটের আলাদা বুলিয়ান স্টোরেজ ক্লাস নেই। পরিবর্তে, বুলিয়ান মানগুলি পূর্ণসংখ্যা 0 (মিথ্যা) এবং 1 (সত্য) হিসাবে সংরক্ষণ করা হয়।


24
"INTEGER। মানটি একটি স্বাক্ষরিত পূর্ণসংখ্যা, 1, 2, 3, 4, 6, বা 8 বাইটের মানের দৈর্ঘ্যের উপর নির্ভর করে সঞ্চয় করে।" আমার ধারণা, কোনও বোল সঞ্চয় করতে 1 বাইট ব্যবহার করা খুব খারাপ নয়।

2
ঘোড়ার মুখ থেকে সোজা: "এসকিউএলাইটের আলাদা বুলিয়ান স্টোরেজ ক্লাস নেই। পরিবর্তে, বুলিয়ান মানগুলি পূর্ণসংখ্যা 0 (মিথ্যা) এবং 1 (সত্য) হিসাবে সংরক্ষণ করা হয়।"
টোবিয়াস

3
পারফরম্যান্সের ক্ষেত্রে কোনটি ভাল! সত্য / মিথ্যা স্ট্রিং বা 0/1 পূর্ণসংখ্যা হিসাবে?
মুহাম্মদ বাবর

9
@ মুহাম্মাদবাবার 0/1 সর্বাধিক স্পষ্টভাবে। স্ট্রিংগুলি ধীরে ধীরে এবং আরও জায়গা নেয়।
Davor

1
@ জোস প্রকৃতপক্ষে, 0 এবং 1 পূর্ণসংখ্যার (পাশাপাশি এনএইউএল) সরাসরি সারি তথ্য প্রকারের ঘোষণায় এনকোড করা হয়। সুতরাং এটি বুলিয়ান প্রতি শূন্য বাইট, যদি আপনি কেবল প্রকৃত ডেটা স্টোরেজ গণনা করেন যা দুর্দান্ত। আপনি যদি ফাইল ফর্ম্যাটের জন্য প্রয়োজনীয় প্রতি-কলাম-প্রতি-সারি বুককিপিং গণনা করেন তবে, সমস্ত ডেটা ধরণের অতিরিক্ত বাইটের দরকার হয়, যা দুর্দান্ত নয়। :) (রেফারেন্স: sqlite.org/fileformat.html#record_format )
তুলনামূলকভাবে_রেন্ডম

93

এসকিউএলাইটে আপনি সবচেয়ে ভাল যা করতে পারেন তা হল মিথ্যা ও সত্য উপস্থাপনের জন্য পূর্ণসংখ্যা 0 এবং 1 ব্যবহার করুন। আপনি কলামের ধরণটি এভাবে ঘোষণা করতে পারেন:

CREATE TABLE foo(mycolumn BOOLEAN NOT NULL CHECK (mycolumn IN (0,1)));

NOT NULLযদি আপনি NULL0 এবং 1 এর পাশাপাশি অনুমতি দিতে চান তবে ছাড় দিন ।

BOOLEANএখানে টাইপ নামের ব্যবহারটি পাঠযোগ্যতার জন্য, এসকিউএলাইটের কাছে এটি কেবল একটি ধরণের NUMERIC স্নেহযুক্ত

উল্লেখ্য যে এসকিউএলাইট ৩.৩.০ (২০০ 2006) থেকে CHECK সীমাবদ্ধতাগুলি সমর্থিত ।

এখানে কিছু উদাহরণ অন্তর্ভুক্ত রয়েছে যা কাজ করবে:

sqlite> INSERT INTO foo VALUES(0);
sqlite> INSERT INTO foo VALUES(1);
sqlite> INSERT INTO foo VALUES(0.0);
sqlite> INSERT INTO foo VALUES(1.0);
sqlite> INSERT INTO foo VALUES("0.0");
sqlite> INSERT INTO foo VALUES("1.0");
sqlite> select mycolumn, typeof(mycolumn) from foo;
0|integer
1|integer
0|integer
1|integer
0|integer
1|integer

এবং কিছু ব্যর্থ হবে:

sqlite> INSERT INTO foo VALUES("-1");
Error: constraint failed
sqlite> INSERT INTO foo VALUES(0.24);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(100);
Error: constraint failed
sqlite> INSERT INTO foo VALUES(NULL);
Error: foo.mycolumn may not be NULL
sqlite> INSERT INTO foo VALUES("true");
Error: constraint failed
sqlite> INSERT INTO foo VALUES("false");
Error: constraint failed

86

SQLite বুলিয়ান ডেটাটাইপ: এসকিউএলাইটের
আলাদা বুলিয়ান স্টোরেজ ক্লাস নেই। পরিবর্তে, বুলিয়ান মানগুলি পূর্ণসংখ্যা 0 (মিথ্যা) এবং 1 (সত্য) হিসাবে সংরক্ষণ করা হয়।

আপনি বুলিয়ানকে এইভাবে রূপান্তর করতে পারেন:

int flag = (boolValue)? 1 : 0;

আপনি নীচে হিসাবে পূর্বে ফিরে বুলেয়ান রূপান্তর করতে পারেন:

 // Select COLUMN_NAME  values from db. 
 // This will be integer value, you can convert this int value back to Boolean as follows
Boolean flag2 = (intValue == 1)? true : false;

আপনি যদি স্ক্লাইটটি অন্বেষণ করতে চান তবে এখানে একটি টিউটোরিয়াল রয়েছে
আমি এখানে একটি উত্তর দিয়েছেন । এটি তাদের পক্ষে কাজ করছে।


13
কোডের চূড়ান্ত লাইনটি কেবল "বুলিয়ান পতাকা 2 = (intValue == 1)" হতে পারে
সিজেএ

16
আমি প্রস্তাব দিইBoolean flag2 = (intValue != 0);
হামজেহ সোবহ

অথবা আপনি কেবল বুলিয়ান পতাকা 2 = (ইনভ্যালু> 0) করতে পারেন;
এফরিন সঞ্জয় অধিকার


5

এরিকওয়া এর উত্তর আরও। চেক সীমাবদ্ধতাগুলি একটি পাঠ্য ডেটাটাইপ প্রয়োগ করে এবং কেবল সত্য বা মিথ্যা ক্ষেত্রে নির্দিষ্ট মানগুলিকে অনুমতি দিয়ে সিউডো বুলিয়ান কলাম সক্ষম করতে পারে eg

CREATE TABLE IF NOT EXISTS "boolean_test"
(
    "id" INTEGER PRIMARY KEY AUTOINCREMENT
,   "boolean" TEXT NOT NULL 
        CHECK( typeof("boolean") = "text" AND
               "boolean" IN ("TRUE","FALSE")
        )
);

INSERT INTO "boolean_test" ("boolean") VALUES ("TRUE");
INSERT INTO "boolean_test" ("boolean") VALUES ("FALSE");
INSERT INTO "boolean_test" ("boolean") VALUES ("TEST");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES ("true");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES ("false");

Error: CHECK constraint failed: boolean_test

INSERT INTO "boolean_test" ("boolean") VALUES (1);

Error: CHECK constraint failed: boolean_test

select * from boolean_test;

id  boolean
1   TRUE
2   FALSE

5

তবে, আপনি যদি সেগুলির একটি গোছা সংরক্ষণ করতে চান তবে আপনি সেগুলি বিট-শিফট করতে পারেন এবং সেগুলি একত্রে সংরক্ষণ করতে পারেন, ইউনিক্স ফাইলের অনুমতি / মোডের মতো কিছুটা।

উদাহরণস্বরূপ 755 মোডের জন্য, প্রতিটি ডিজিট ব্যবহারকারীদের বিভিন্ন শ্রেণির বোঝায়: মালিক, গোষ্ঠী, সর্বজনীন। প্রতিটি সংখ্যার মধ্যে 4 টি পড়া হয়, 2 টি লেখা হয়, 1 কার্যকর করা হয় তাই 7 তাদের সমস্ত বাইনারি 111 এর মতো হয় 5 5 টি পড়া হয় এবং কার্যকর হয় তাই 101. আপনার নিজস্ব এনকোডিং প্রকল্প তৈরি করুন।

আমি কেবল ডেটালিজ ডাইরেক্ট থেকে টিভি শিডিউল ডেটা সংরক্ষণ করার জন্য কিছু লিখছি এবং আমার বাইনারি বা হ্যাঁ / কোনও ক্ষেত্র নেই: স্টেরিও, এইচডিটিভি, নতুন, আইআই, ক্লোজ ক্যাপশনযুক্ত, ডলবি, স্প্যানিশের সিপ, প্রিমিয়ার। সুতরাং 7 বিট, বা একটি পূর্ণসংখ্যার সর্বোচ্চ 127. একটি অক্ষর সত্যই।

আমি এখন যা কাজ করছি তার থেকে এসি উদাহরণ। has () হ'ল একটি ফাংশন যা ২ য় স্ট্রিং প্রথমটিতে থাকলে 1 প্রদান করে। inp হ'ল এই ফাংশনটির ইনপুট স্ট্রিং। মিস্ক একটি স্বাক্ষরবিহীন অক্ষর 0 থেকে শুরু করে।

if (has(inp,"sap='Spanish'") > 0)
  misc += 1;
if (has(inp,"stereo='true'") > 0)
  misc +=2;
if (has(inp,"ei='true'") > 0)
  misc +=4;
if (has(inp,"closeCaptioned='true'") > 0)
  misc += 8;
if (has(inp,"dolby=") > 0)
  misc += 16;
if (has(inp,"new='true'") > 0)
  misc += 32;
if (has(inp,"premier_finale='") > 0)
  misc += 64;
if (has(inp,"hdtv='true'") > 0)
  misc += 128;

সুতরাং আমি আরও পূর্ণাঙ্গের জন্য একটি পূর্ণসংখ্যায় 7 বুলিয়ান সংরক্ষণ করছি।


এই উত্তরটি সিএসের দৃষ্টিকোণে হৃদয় উষ্ণায়িত হয়। :)
বরুণ

2

আপনি নিম্নলিখিতটি ব্যবহার করে উপরের সমীকরণগুলিকে সহজ করতে পারেন:

boolean flag = sqlInt != 0;

যদি বুলিয়ানটির ইন্ট উপস্থাপনা (sqlInt) 0 হয় (মিথ্যা), বুলিয়ান (পতাকা) মিথ্যা হবে, অন্যথায় এটি সত্য হবে।

সংক্ষিপ্ত কোডটি এর সাথে কাজ করার জন্য সর্বদা সুন্দর :)


-4

এটি করার আরেকটি উপায় হ'ল একটি পাঠ্য কলাম। এবং তারপরে / ডাটাবেস থেকে মানটি সংরক্ষণ / পড়ার আগে বুলিয়ান এবং স্ট্রিংয়ের মধ্যে বুলিয়ান মান রূপান্তর করুন।

যাত্রা। আপনার "boolValue = true;"

স্ট্রিং:

//convert to the string "TRUE"
string StringValue = boolValue.ToString;  

এবং বুলিয়ান ফিরে:

//convert the string back to boolean
bool Boolvalue = Convert.ToBoolean(StringValue);

6
@ ক্রেইগ ম্যাকমাহন পরিবর্তে পূর্ণসংখ্যা ব্যবহার করার পরামর্শ দিয়েছেন: প্রাথমিক সংখ্যাগুলি সত্য, নন-প্রাইমগুলি মিথ্যা প্রতিনিধিত্ব করে
বারিক

18
আমি এটি অত্যন্ত আপত্তিকর বলে মনে করি, @ বারিক। স্পষ্ট সমাধানটি হ'ল "সত্য" বা "মিথ্যা" শব্দটি একটি চিত্রের উপর রেন্ডার করা এবং তারপরে ডাটাবেস সারিতে এটি একটি জেপিইজি-এনকোডেড ব্লগ হিসাবে সংরক্ষণ করুন। তারপরে কেউ একটি সাধারণ বৈশিষ্ট্য নিষ্কাশন অ্যালগরিদম ব্যবহার করে আবার মানটি পড়তে পারে।
ক্রেগ ম্যাকমাহন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.