বুলিয়ান মানগুলি সংরক্ষণের জন্য কোন মাইএসকিউএল ডেটা টাইপ করে


1206

যেহেতু মাইএসকিউএল এর কোনও 'বুলিয়ান' ডেটা টাইপ আছে বলে মনে হচ্ছে না, আপনি মাইএসকিউএলে সত্য / মিথ্যা তথ্য সংরক্ষণ করার জন্য কোন ডেটা টাইপ করেন?

বিশেষত / পিএইচপি স্ক্রিপ্ট থেকে / লেখার এবং পড়ার প্রসঙ্গে।

সময়ের সাথে সাথে আমি বেশ কয়েকটি পদ্ধতি ব্যবহার করেছি এবং দেখেছি:

  • টিনিনিন্ট, 0/1 মানগুলি সহ ভারচার ক্ষেত্রগুলি,
  • '0' / '1' বা 'সত্য' / 'মিথ্যা' স্ট্রিং সম্বলিত বার্চর ক্ষেত্রগুলি
  • এবং অবশেষে এনুম ফিল্ডস দুটি 'সত্য' / 'মিথ্যা' বিকল্প রয়েছে।

উপরের কোনওটিই অনুকূল বলে মনে হচ্ছে না। আমি টিনিনেন্ট 0/1 বৈকল্পিক পছন্দ করতে চাই, যেহেতু পিএইচপি-তে স্বয়ংক্রিয় ধরণের রূপান্তর আমাকে বুলিয়ান মান দেয় বরং সহজভাবে।

সুতরাং আপনি কোন ডেটা টাইপ ব্যবহার করেন? বুলিয়ান মানগুলির জন্য এমন কোনও ধরণের নকশা তৈরি করা আছে যা আমি উপেক্ষা করেছি? এক প্রকার বা অন্য ব্যবহার করে আপনি কি কোনও সুবিধা / অসুবিধা দেখতে পাচ্ছেন?


217
যে কেউ এই প্রশ্নের পুরানো উত্তরগুলি পড়ছেন তাদের বুঝতে হবে যে মাইএসকিউএল 5 সংস্করণে একটি বিট ডেটাটাইপ যুক্ত করেছে that তথ্যটি আপনার নিজের মতো করে ব্যবহার করুন। dev.mysql.com/doc/refman/5.0/en/bit-type.html
smp7d


7
এমওয়াইএসকিউএল বুলিয়ান বর্তমান সংস্করণের জন্য উপলব্ধ- dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html এটি পরীক্ষা করে দেখুন। সেই মান অনুসারে শূন্যকে মিথ্যা হিসাবে বিবেচনা করা হবে
ডিভটি

7
bit(1)এক্সেল আমদানি করার জন্য কিছুটা বিট **। কাজে স্যুইচিং tinyint(1)
সিস টিমারম্যান

8
এখন আমাদের 5 বছর পরে বুলিয়ান রয়েছে
ভি-শাই

উত্তর:


1232

মাইএসকিউএল 5.0.3 এবং উচ্চতর ক্ষেত্রে আপনি ব্যবহার করতে পারেন BIT। ম্যানুয়ালটিতে বলা হয়েছে:

মাইএসকিউএল 5.0.3 হিসাবে, বিআইটি ডেটা টাইপ বিট-ফিল্ড মানগুলি সংরক্ষণ করতে ব্যবহৃত হয়। এক ধরণের বিআইটি (এম) এম-বিট মানগুলির স্টোরেজ সক্ষম করে। এম 1 থেকে 64 পর্যন্ত হতে পারে।

অন্যথায়, মাইএসকিউএল ম্যানুয়াল অনুসারে আপনি বুল এবং বুলিয়ান ব্যবহার করতে পারেন যা এই মুহুর্তে টিনিনেন্টের উপকরণ (1) রয়েছে:

বুল, বুলিয়ান: এই ধরণেরগুলি TINYINT (1) এর প্রতিশব্দ । শূন্যের মানকে মিথ্যা বলে বিবেচনা করা হয়। অ-শূন্য মানগুলি সত্য বলে বিবেচিত হয়।

মাইএসকিউএল আরও জানিয়েছে:

আমরা ভবিষ্যতে মাইএসকিউএল রিলিজে স্ট্যান্ডার্ড এসকিউএল অনুসারে পূর্ণ বুলিয়ান টাইপ হ্যান্ডলিং বাস্তবায়নের পরিকল্পনা করি।

তথ্যসূত্র: http://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html


11
হ্যাঁ, আমি এই বা যে কোনও CHAR (1) এর জন্য যেতে পারি এবং প্রসঙ্গের উপর নির্ভর করে 'Y' / 'N' বা 'T' / 'F' ইত্যাদি সঞ্চয় করি। একটি ছোট পূর্ণসংখ্যার প্রকারটি ব্যবহারের সুবিধাটি হ'ল আপনি আরডিবিএমএস-এস জুড়ে সর্বাধিক বহনযোগ্যতা পান
রোল্যান্ড বোম্যান

36
কমপক্ষে পিএইচপি-তে চরের জন্য যাওয়াই আরও বেশি কোডের দিকে নিয়ে যাবে যেহেতু !$booleanপরবর্তী প্রক্রিয়াজাতকরণ ব্যতীত কখনই সঠিকভাবে মূল্যায়ন করা যায় না।
মাইল্ড ফাজ

10
@ পেসারিয়ার কিছুই আপনি নিজের গুগল করতে পারেন নি তবে ঠিক আছে, আমি কামড় দেব। সবার আগে, দয়া করে ডেটা0 টাইপ। Hd দেখুন। অনুগ্রহ করে নোট করুন যে আনানোডব সেখানে স্থানীয়ভাবে কোনও বিআইটি টাইপ সংজ্ঞায়িত করে না। এটি যদি আপনার বর্ণনার সাথে বিআইটি ক্ষেত্রগুলির সাথে আচরণ করে তবে অবশ্যই আমরা সেখানে এর অস্তিত্বের কিছু ইঙ্গিত খুঁজে পাই। দ্বিতীয়ত, mysqlperformanceblog.com/2008/04/23/… পড়ুন । এবং "মার্কটেটপ্লেস" -তে কোন বিস্ময়কর মাইএসকিউএল ক্লায়েন্ট বিআইটি ক্ষেত্রগুলির সাথে দুর্দান্ত খেলেন তা আমাদের আলোকিত করতে দ্বিধা করবেন না। নিঃসন্দেহে যারা নিবন্ধটি মিস করেছেন তাদের জন্য তারা কাজে আসবে।
রোল্যান্ড বোম্যান

9
আমি যখন স্ট্যান্ডার্ড মাইএসকিএল কমান্ড লাইন ক্লায়েন্ট বিট ফিল্ডগুলি থেকে একটি নির্বাচন করি তখন সম্পূর্ণ ফাঁকা দেখা যায়। এ কারণে আমি টিনআইএনটি (1) পছন্দ করি।
ব্যবহারকারী

8
@ মাইকপুরসেল আমি জিজ্ঞাসা করতে ঘৃণা করি তবে আপনি কেন auto_incrementবুলিয়ান মান উপস্থাপন করে একটি কলামে চান ?
ক্রিস হেইস

248

BOOLএবং BOOLEANএর প্রতিশব্দ হয় TINYINT(1)। শূন্য false, অন্য কিছু true। আরও তথ্য এখানে


7
(1)চেয়ে নির্ধারণ কিভাবে মান প্রদর্শন করা হয়, যদি আপনি স্টোরেজ আকার চলেছেন সচেতন তারপর আপনি ব্যবহার করতে চান আর কিছুই নেই BITপরিবর্তে
JamesHalsall

35
@ জামেসহালসাল: প্রকৃতপক্ষে BIT(1)এবং TINYINT(1)উভয়ই এক বাইট স্টোরেজ ব্যবহার করবে। মাইএসকিউএল ৫.০.৩ অবধি আপাতদৃষ্টিতে BITএকটি প্রতিশব্দ ছিল TINYINT। মাইএসকিউএলের পরবর্তী সংস্করণগুলি বিআইটির প্রয়োগ পরিবর্তন করেছে। তবে বাস্তবায়ন পরিবর্তনের পরেও, BITডেটাটাইপটির এখনও কোনও "স্টোরেজ আকার" সুবিধা নেই (কমপক্ষে ইনোডিবি এবং মাইআইএসএএমের সাথে; অন্যান্য স্টোরেজ ইঞ্জিনগুলি যেমন এনডিবিতে একাধিক বিআইটি কলাম ঘোষণার জন্য কিছু স্টোরেজ অপ্টিমাইজেশন থাকতে পারে)) বড় সমস্যাটি হ'ল কিছু ক্লায়েন্ট লাইব্রেরিগুলি ফিরিয়ে নেওয়া BITডেটাটাইপ কলামগুলি সনাক্ত করে বা যথাযথভাবে পরিচালনা করে না । একটি TINYINTভাল কাজ করে।
spencer7593

5
মাইএসকিউএল 5.0 ম্যানুয়াল স্পষ্টভাবে বলেছে যে একটি বুলিয়ান মান 1 বা 0 হয় true
ওয়াল্টার

7
@ ওয়াল্টার: এটি আসলে একরকম সত্য, ব্যাখ্যাটির কিছুটা অভাব রয়েছে। সংক্ষেপে, একটি বুলিয়ান প্রসঙ্গে, একটি অভিব্যক্তি নাল, মিথ্যা বা সত্যকে মূল্যায়ন করতে পারে। মাইএসকিউএল বিবৃতিতে, বুলিয়ান প্রসঙ্গে মূল্যায়িত একটি এক্সপ্রেশনটি প্রথমে পূর্ণসংখ্যা হিসাবে মূল্যায়ন করা হয় (দশমিক এবং ভাসমান মানগুলি বৃত্তাকার হয়, মাইএসকিউএল স্ট্রিংগুলিকে পূর্ণসংখ্যায় রূপান্তর করে) ings একটি নাল স্পষ্টতই নাল (সত্য বা মিথ্যা নয়)। 0 এর পূর্ণসংখ্যার মানটি FALSE হিসাবে পরিচালিত হয় এবং অন্য কোনও পূর্ণসংখ্যার মান (1, 2, -7, ইত্যাদি) সত্য হিসাবে মূল্যায়ন করে। সামঞ্জস্যের জন্য, আমরা সেই যুক্তিটি নকল করছি / TINYINT বুলিয়ান পরিচালনা
spencer7593

4
@ ওয়াল্টার: এটি পরীক্ষা করা সহজ, যেমন SELECT 'foo' AS bar FROM dual WHERE -7। এক্সপ্রেশন -7 একটি বুলিয়ান প্রসঙ্গে মূল্যায়ন করা হয়, এবং ক্যোয়ারী একটি সারিতে প্রত্যাবর্তন করে। আমরা 0, বা যে কোনও এক্সপ্রেশন দিয়ে পূর্ণসংখ্যার মান 0 এর মূল্যায়ন করে পরীক্ষা করতে পারি, এবং কোনও সারি ফিরে আসে না। WHERE ধারাটিতে প্রকাশটি যদি শূন্য ব্যতীত কোনও নন-নাল পূর্ণসংখ্যার মানকে মূল্যায়ণ করে তবে এক্সপ্রেশনটি সত্য। (আমি বিশ্বাস করি দশমিক এবং ভাসা মান হল "বৃত্তাকার" পূর্ণসংখ্যা, যেমন পেতে WHERE 1/3মূল্যায়ণ করতে WHERE 0আমরা সঙ্গে একই ফলাফল পেতে। WHERE 'foo'কারণ স্ট্রিং 'foo'এছাড়াও পূর্ণসংখ্যা মান 0. মূল্যায়ণ
spencer7593

71

এটি একটি মার্জিত সমাধান যা আমি যথেষ্ট প্রশংসা করি কারণ এটি শূন্য ডেটা বাইট ব্যবহার করে:

some_flag CHAR(0) DEFAULT NULL

এটি সত্যতে সেট করতে, সেট করুন some_flag = ''এবং এটি মিথ্যাতে সেট করুন, সেট করুন some_flag = NULL

তারপরে সত্যের জন্য পরীক্ষা IS NOT NULLকরতে, কিছু_ফ্ল্যাগ কিনা এবং মিথ্যা পরীক্ষার জন্য, পরীক্ষা করুন কিনা কিছু_ফ্লেগ কিনা IS NULL

(এই পদ্ধতিটি "হাই পারফরম্যান্স মাইএসকিউএল: অপ্টিমাইজেশন, ব্যাকআপস, রেপ্লিকেশন এবং আরও" জোন ওয়ারেন লেন্টজ, ব্যারন শোয়ার্জ এবং আরজেন লেন্টজ দ্বারা বর্ণনা করা হয়েছে।)


3
অভিনব কৌশল! মাইএসকিউএল <5 এর সাথে কাজ করা এবং বিআইটি-র তুলনায় সম্ভবত হালকা পদচিহ্নের সাহায্যে এটি সহায়ক, তবে কনভেনশন এবং সামান্য কম গণনা ওভারহেড (লজিক বনাম নির্ভুল মান) মেনে চলার প্রয়াসে আমি বলব বিআইটি যাওয়ার আরও ভাল উপায়।
জামনট

59
'দ্রুত' হতে পারে, তবে এটি ডেটাটিকে অবিচ্ছিন্ন করে দেয় যে কোনও নতুন বিকাশকারীকে কলামটি কী বলে তার কোনও ধারণা নেই।
রিচথোফেন

5
এটি বিআইটি (1)
আইটিএস আলাস্কা

25
ভাগ্য ভাল এটিতে মানচিত্রের জন্য একটি ORM পেয়েছে।
ক্রেগ ল্যাবেন্জ

4
আমি রিচথোফেনের সাথে একমত, এবং এমন পরিস্থিতিটি কল্পনা করা আমার পক্ষে কঠিন মনে হয় যেখানে আমি কখনও এই সমাধানটি ব্যবহার করার পক্ষে পরামর্শ চাই। তবে, যদি এটি ব্যবহার করতে হয়, তবে COMMENTকলামের সংজ্ঞায় একটি হিসাবে নির্দিষ্ট NULLকরে যা মিথ্যা নির্দেশ করে এবং ''সত্যটি নির্দেশ করে ভবিষ্যতের বোঝাপড়াকে সহায়তার দিকে কিছুটা ছোট পথ যেতে পারে।
উদয়

34

আপনি যদি বুুলিয়ান প্রকারটি ব্যবহার করেন তবে এটি TINYINT (1) এর সাথে যুক্ত হয়। আপনি যদি স্ট্যান্ডার্ডযুক্ত এসকিউএল ব্যবহার করতে চান এবং ক্ষেত্রটি সীমার মানের বাইরে থাকতে পারে তবে এটি সর্বোত্তম ((মূলত যেটি 0 নয় তা 'সত্য' হবে)।

ENUM ('মিথ্যা', 'সত্য') আপনাকে আপনার এসকিউএলটিতে স্ট্রিংগুলি ব্যবহার করতে দেবে এবং মাইএসকিউএল ক্ষেত্রটি অভ্যন্তরীণভাবে একটি পূর্ণসংখ্যা হিসাবে সংরক্ষণ করবে যেখানে এনাম নির্দিষ্ট করা আদেশের ভিত্তিতে 'ফলস' = 0 এবং 'সত্য' = 1 থাকবে ।

মাইএসকিউএল 5+ এ আপনি 1-বিট সংখ্যাসূচক প্রকারটি নির্দেশ করতে একটি বিআইটি (1) ক্ষেত্র ব্যবহার করতে পারেন। আমি বিশ্বাস করি না যে এটি আসলে স্টোরেজে কোনও কম জায়গা ব্যবহার করে তবে আবার আপনাকে সম্ভাব্য মানগুলি 1 বা 0 এ সীমাবদ্ধ করতে দেয়।

উপরের সমস্তগুলি প্রায় একই পরিমাণ স্টোরেজ ব্যবহার করবে, তাই আপনার সাথে কাজ করা সবচেয়ে সহজ বলে মনে করা সবচেয়ে ভাল।


8
এনইউএম সম্পর্কিত আপনার মন্তব্য সত্য নয়: কাস্ট কাস্ট করুন (ইউএসএনজিওড হিসাবে ইউরেনামকোল) এবং আপনি খেয়াল করবেন যে মিথ্যাটি 1 হবে, এবং সত্য হবে 2। ENUM এর সাথে আর একটি সমস্যা হ'ল এটি sertোকানো খুব সহজ '(ফাঁকা স্ট্রিং) )। আমি এটি ব্যবহার করে সিদ্ধান্ত নেব না।
রোল্যান্ড বুমান

4
আমার অভিজ্ঞতায় পিএইচপি কোড থেকে বিআইটি (1) ফিল্ডটি ব্যবহার করা কিছুটা ঝামেলাজনক ছিল। TINYINT (1) অনেক সহজ এবং আরও পঠনযোগ্য কোড উত্পাদন করেছিল।
এম-পেরোর

1
@ এম-Peror - "একটু ব্যবহার (1) পিএইচপি কোড থেকে ক্ষেত্রটিতে কোনও ছিল বিট বিরক্তিজনক" ... কোন শ্লেষ উদ্দেশ্যে। :) তবে, হ্যাঁ, আমি একমত। আমি মনে করি TINYINT (1) খুব সহজ হচ্ছে ... কেন তা কেবল মনে করতে পারছি না। অন্য কারও এই সম্পর্কে চিন্তা আছে? বিআইটি (1) তলদেশে আরও ভাল বলে মনে হচ্ছে কারণ আপনি 0 বা 1 এর মধ্যে সীমাবদ্ধ রাখতে পারেন I আমি মনে করি বিআইটি কখনও কখনও বাইনারি ডেটা (প্রোগ্রামিং ভাষা এবং ড্রাইভার / লাইব্রেরির উপর নির্ভর করে) হিসাবে ব্যাখ্যা করা হয়; যদিও, TINYINT আরও একটি সংখ্যার মতো আচরণ করা হয়েছিল।
বিমিনিয়ার

2
@ বিমিনার - হাহাহা, এটি সত্যিই অযৌক্তিক ছিল, এটি লক্ষ্য করেনি :) তবে সত্যই যদি আমি মনে করি সঠিকভাবে বিট ক্ষেত্রটিকে বাইনারি কিছু হিসাবে ব্যাখ্যা করা হয়েছিল, তবে ক্ষুদ্র অঙ্কটি একটি সংখ্যা হিসাবে বিবেচনা করা সহজ ছিল এবং সে কারণে এটি আরও সহজ একটি (বুলিয়ান) এক্সপ্রেশন ব্যবহার করুন।
এম পেরোর

34

এই প্রশ্নের উত্তর দেওয়া হয়েছে তবে আমি অনুভব করেছি যে আমি আমার 0.02 ডলারে ফেলেছি। আমি প্রায়শই একটি CHAR(0), যেখানে ব্যবহার করি '' == true and NULL == false

মাইএসকিএল ডক্স থেকে :

CHAR(0)আপনার যখন দুটি কলাম নিতে পারে এমন কলামের প্রয়োজন হয় তখন এটিও বেশ সুন্দর: একটি কলাম যা CHAR(0) NULLকেবলমাত্র একটি বিট দখল করে এবং কেবলমাত্র মান NULLএবং ''(খালি স্ট্রিং) নিতে পারে।


16
মিমি, মনে হচ্ছে আপনি যদি আমার মতো হন তবে সমস্যা চাইছেন। আমি বলতে চাইছি ভাষার উপর নির্ভর করে NUL এবং '' (উদাহরণস্বরূপ পিএইচপি) এর মধ্যে পার্থক্য না পাওয়া খুব সহজ হতে পারে।
রোল্যান্ড বাউম্যান

3
স্থান সংরক্ষণের ক্ষেত্রে (বুলিয়ান প্রতিনিধিত্ব করতে ব্যবহৃত বাইট সংখ্যা), এই পদ্ধতির একটি পরিষ্কার বিজয়ী। এটি TINYINT এর উপরে একটি বাইট সংরক্ষণ করে। নেতিবাচক দিক (যেমন কিছু মন্তব্য দেখায়) হ'ল কিছু ক্লায়েন্টকে একটি NUL এবং একটি খালি স্ট্রিংয়ের মধ্যে পার্থক্য করতে সমস্যা হতে পারে। এমনকি কিছু রিলেশনাল ডাটাবেস (উদাহরণস্বরূপ ওরাকল) শূন্য দৈর্ঘ্যের স্ট্রিং এবং একটি NUL এর মধ্যে পার্থক্য করে না।
spencer7593

3
এই খুব চালাক! আমি চালাক কোড লিখতাম, এখন আমি এটিকে প্লেগের মতো এড়িয়ে চলি। আমি এখন চাইছি আমার কোডটিতে কেবল সঠিক আচরণ নয়, স্ফটিক স্বচ্ছ উদ্দেশ্য রয়েছে। আমার উপদেশ? আপনি যদি কোড / ডাটাবেস সমর্থন করতে চান এমন কাউকে বিভ্রান্ত করতে চান তবেই এটি করুন। উদাহরণস্বরূপ, পিএইচপি উভয় ক্ষেত্রে ''এবং nullমিথ্যা মান।
সিজে ডেনিস

1
@ সিজেডেনিস যদি আপনি আপনার ডাটাবেস স্তরটি সংগ্রহস্থলের প্যাটার্নের পিছনে ফেলে রেখে থাকেন তবে আপনাকে এই সমাধানটির অস্পষ্টতা সম্পর্কে চিন্তা করতে হবে না।
অগ্রহামার

18

আমি মাইএসকিএল-তে বুলিয়ান মান সংরক্ষণ করতে TINYINT (1) ব্যবহার করি।

এটি ব্যবহার করার কোনও সুবিধা আছে কিনা আমি জানি না ... তবে আমি যদি ভুল না করি তবে মাইএসকিএল বুলেটিয়ান (বিওওএল) সঞ্চয় করতে পারে এবং এটি এটি একটি ক্ষুদ্রকণা হিসাবে (1) সংরক্ষণ করে

http://dev.mysql.com/doc/refman/5.0/en/other-vendor-data-types.html


17

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


1
টাইপকাস্টিং মন্তব্যের জন্য +1। প্রোগ্রামিং ভাষাগুলির সাথে কাজ করার সময় এটির সাথে যুক্ত করার জন্য ধারাবাহিকতার পক্ষে অলস প্রোগ্রামিং কৌশলগুলি এড়িয়ে চলুন। কেবল সমানগুলির পরিবর্তে অভিন্ন অপারেটরগুলি ব্যবহার করুন। পিএইচপি-র ক্ষেত্রে ($ var == "") যদি 0, মিথ্যা, নাল, অপরিজ্ঞাত এবং "" এর জন্য সত্য হয়। সমস্ত মানগুলির পরীক্ষা করার জন্য এটি ব্যবহার করা সবচেয়ে ভাল তবে (সত্য === খালি ($ var)) এটি অপরিজ্ঞাত ত্রুটিগুলিও এড়াতে পারে। আপনি যদি (is_int ($ var) && $ var === 0) সাথে কাজ করছেন এমন ডেটা টাইপকেও বৈধ করে তোলা উচিত বা কাজের জন্য নির্দিষ্ট টাইপ টাইপ (int) $ var হিসাবে জোর করতে এটি টাইপকাস্ট করতে হবে।
fyrye

@ এটি কি মাইএসকিউএল এর পক্ষে এমএসএসকিউএলের জন্য একই পরিমাণে সত্য? আমি একটি নতুন অ্যাপ্লিকেশন স্থানান্তর করছি যা এমএসএসকিউএল থেকে মাইএসকিউএল এখনও উত্পাদনে যায় নি। আমি পিএইচপি ব্যবহার করছি না বরং সি # ওভারটিকে জাভা ৮ তে রূপান্তর করছি Java যদিও জাভা শক্তভাবে টাইপ করা ভাষা আমি টাইপ হ্যান্ডলিং সম্পর্কে উদ্বিগ্ন নই ... কেবলমাত্র সমস্ত বিট পতাকা যা একটি বাইট থেকে 8 টি পতাকা পর্যন্ত সরানো হবে TINYINT (1) প্রদত্ত প্রতিটি পতাকা 1 টি বাইট করুন। আপনি কি এই বিষয়ে মাইএসকিউএল এর জন্য কোনও ডকুমেন্টেশন জানেন?
জ্যাক জান্নেন

1
@ থোর কিছু গভীর গবেষণা করে উত্তরটি কী হওয়া উচিত তা স্পষ্ট। পরিবর্তন ঘটে এবং আমরা এই হ্যান্ডলিংয়ের উন্নতি দেখেছি। অ্যাপ্লিকেশন স্তর / ডেটা অ্যাক্সেস লেয়ারে থাকা আপনার ভাষাটি জানুন এবং আপনার লাইব্রেরি সমর্থন জানুন। আমি বর্তমানে জাভা ব্যবহার করছি এবং হাইবারনেট এবং জেডিবিসির মতো লাইব্রেরিগুলির জন্য বিআইটি (1) এই সময়ে প্রস্তাবিত পছন্দ। এখানে ইউআরএল [টেবিল 5.2 দেখুন]: dev.mysql.com/doc/connector-j/en/…
জ্যাক জান্নসেন

12

মাইএসকিউএল যতক্ষণ না একটি বিট ডেটাটাইপ প্রয়োগ করে, যদি আপনার প্রসেসিং সত্যই স্থান এবং / অথবা সময়ের জন্য চাপানো হয় যেমন উচ্চ ভলিউম লেনদেনের সাথে, bit_flagsআপনার সমস্ত বুলিয়ান ভেরিয়েবলের জন্য একটি TINYINT ক্ষেত্র তৈরি করুন , এবং আপনার এসকিউএল-এ আপনি যে বুলিয়ান বিটটি চান তা স্থানান্তর করুন mas প্রশ্ন.

উদাহরণস্বরূপ, যদি আপনার বাম-সর্বাধিক বিট আপনার বুল ক্ষেত্রের প্রতিনিধিত্ব করে, এবং 7 ডানদিকের বিটগুলি কিছুই উপস্থাপন করে না, তবে আপনার bit_flagsক্ষেত্রটি 128 (বাইনারি 10000000) সমান হবে। সাতটি ডানদিকের বিটগুলি (বিটওয়াস অপারেটর ব্যবহার করে) মুখোশ করুন (লুকিয়ে রাখুন) এবং ৮০০ বিট &সাতটি স্পেসটি ডানদিকে স্থানান্তর করুন, এটি 00000001 দিয়ে শেষ হবে Now এখন পুরো সংখ্যাটি (যা এই ক্ষেত্রে, 1) আপনার মান।

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;

if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

আপনি যেমন পরীক্ষা করেন ঠিক তেমন স্টেটমেন্ট চালাতে পারেন

SELECT (128 & 128) >> 7;

SELECT (0 & 128) >> 7;

প্রভৃতি

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

এই পদ্ধতিটি কার্যকর করার সময় আপনি এই সাইটগুলিকে দরকারী দেখতে পাবেন:


7
এটি ভবিষ্যতের প্রোগ্রামারদের অভিপ্রায়কে উদ্বিগ্ন করার মতো এক ভয়ঙ্কর উপায়ে মনে হচ্ছে। নিশ্চিতভাবে 7 টি বাইট সংরক্ষণ করার জন্য অনেক ঝামেলার মতো মনে হচ্ছে (ধরে নিই যে আপনি সেই এক টেবিলের সমস্ত 8 টি বুল ব্যবহার করছেন!)
হ্যাঁ

@ হ্যাঁ মোটেই বাধা নেই! টেবিলের প্রতিটি ক্ষেত্রের ব্যাখ্যা করে ডকুমেন্টেশন এবং মাইএসকিউএল মন্তব্য লিখুন (উত্তর হিসাবে উল্লেখ করা হয়েছে)! প্রস্তাবিত মাইএসকিউএল আনম্যাসিং কৌশলটি দৃ looks় দেখায় এবং মাত্র কয়েকটি কলাম সহ 16 টি বিভিন্ন বুলিয়ান ক্ষেত্রগুলি সংরক্ষণের পরিবর্তে সেগুলির 16 টির চেয়ে ভাল। যদি বিট ম্যানিপুলেশন ব্যবহার করে খুব বিভ্রান্ত হয় এবং আপনি প্রতিটি বুলিয়ান পেতে আপনার ওয়েব-স্ক্রিপ্টিং ভাষা ব্যবহার করতে পছন্দ করেন তবে কেবল এটি হিসাবে সংরক্ষণ করুন এবং কোডটিতে আনমাস্কিং পদ্ধতি করুন (আপনার এটি 8 টি ক্ষেত্রেও সীমাবদ্ধ করার দরকার নেই) ...VARCHAR
সিপিএইচপিথন

BITটাইপ বিদ্যমান। দেখুন dev.mysql.com/doc/refman/8.0/en/bit-type.html
পাথরের টেবিল

10

আমি জিরো, নুলস এবং '' সঠিকভাবে পিএইচপি, মাইএসকিএল এবং পোষ্ট মানগুলির একটি লুপটি পেতে চেষ্টা করে বিরক্ত হয়েছি, তাই আমি কেবল 'হ্যাঁ' এবং 'না' ব্যবহার করি।

এটি ত্রুটিহীনভাবে কাজ করে এবং এমন কোনও বিশেষ চিকিত্সার দরকার নেই যা স্পষ্ট এবং সহজ কাজ নয়।


17
আপনি যদি সত্যিই এই অতিরিক্ত স্থানটি নষ্ট করতে এবং পারফরম্যান্সের সাথে আপস করতে চান তবে আপনি Y এবং N বিকল্পের সাথে কমপক্ষে CHAR (1) করতে পারতেন।
ILikeTacos

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

8
এই উত্তরটি ভুল নয় কারণ এটি কাজ করবে এবং এটি ক্রেডিট দেওয়ার মতো খারাপ নয়। বেশিরভাগ প্রকল্পের জন্য (যেমন: টেবিলের আকার <1 মিলিল সারি) প্রদত্ত সমাধানগুলির মধ্যে পারফরম্যান্সের পার্থক্য অবহেলাযোগ্য হবে। আমার প্রশ্নগুলি যদি 7 বনাম 5 মিলি সেকেন্ডে ফিরে আসে তবে আমি অভিযোগ করব না ... যদিও আপনার টেবিলগুলি 10 মিলিল সারি বা আরও বেশি হয়ে উঠছে এটি সম্ভবত পছন্দসই সমাধান নয়।
ব্র্যাড

1
ENUM ডেটা ধরণের ব্যবহারের জন্য আমার কাছ থেকে +1। আমি ব্যক্তিগতভাবে এই স্বরলিপিটি পছন্দ করি: ENUM ('y', 'n')। এটি কমপ্যাক্ট (কেবলমাত্র একটি বাইট দীর্ঘ), স্বল্পজ্ঞানযুক্ত এবং সমস্ত বুলিয়ান পতাকাগুলির জন্য অ্যাপ্লিকেশন-স্তরের কনভেনশন হিসাবে ভাল লাগছে। আপনি এটি এইচটিএমএল ফর্ম ক্ষেত্রগুলির সাথে সরাসরি ব্যবহার করতে পারেন। উদাহরণস্বরূপ পিএইচপি সহ: <নির্বাচন নাম = "উত্পাদন"> <বিকল্প মান = "y" <? = $ উত্পাদন === 'y'? 'নির্বাচিত = "নির্বাচিত"': ''? >> হ্যাঁ </ translation> <বিকল্প মান = "এন" <? = $ উত্পাদন === 'এন'? 'নির্বাচিত = "নির্বাচিত" ":' '? >> না </
দফতর

2
এইটি আমার চোখে পড়েছে তবে আমি বলতে চাই জিফকেনডাল ঠিক আছে। এক টন ক্ষেত্রে সর্বোত্তম পারফরম্যান্সের প্রয়োজন নেই এবং যে পদ্ধতিই আপনার পক্ষে কাজ করে তা সঠিক পদ্ধতি।
ম্যাডমিনিও

6

এই লিঙ্কটি উল্লেখ করে মাইএসকিএল-তে বুলিয়ান ডেটাটাইপ , অ্যাপ্লিকেশন ব্যবহার অনুসারে, যদি কেউ কেবল 0 বা 1 সঞ্চয় করতে চায় তবে বিট (1) আরও ভাল পছন্দ।


6
এটি সত্য যে BIT(1)কেবলমাত্র একটি b'0'বা b'1'মান সংরক্ষণের অনুমতি দেবে । BITডেটাটাইপটি নিয়ে সবচেয়ে বড় সমস্যাটি হ'ল বিভিন্ন ক্লায়েন্ট লাইব্রেরিতে ডেটাটাইপের বিভিন্ন ধরণের হ্যান্ডলিং রয়েছে। বিভিন্ন এসকিউএল সরঞ্জামগুলিতে (এসকিউজিওগ, টোড ফর মাইএসকিউএল, এসকিউএল বিকাশকারী), যে সরঞ্জামগুলি "রিভার্স ইঞ্জিনিয়ার" ডাটাবেস মডেলগুলি এবং জেডিবিসি, পিএইচপি, পার্ল ডিবিআই-এর মতো বিভিন্ন ক্লায়েন্ট এবং ভাল পরিমাপের জন্য, কয়েকটি ওআরএম ফ্রেমওয়ার্কগুলি পরীক্ষা করে (টি এসআরকিউল, টোডের জন্য আচরণ পরীক্ষা করে দেখুন) হাইবারনেট, মাইবাটিস, জেপিএ)। ব্যবহারের স্বাচ্ছন্দ্যের ক্ষেত্রে, সরঞ্জাম / কাঠামোর সামঞ্জস্য / নেটিভ সাপোর্ট, TINYINT(1)স্পষ্ট বিজয়ী।
spencer7593

হ্যাঁ. এটি সম্পূর্ণ করে অ্যাপের জন্য বিবেচিত ফ্রেমওয়ার্কের উপর। উদাহরণস্বরূপ, পিএইচপি-র ফ্যালকন কাঠামো বিট ডেটাটাইপ হ্যান্ডেল করে না
Vidz

রেকর্ডের জন্য, মাইবাটিস উভয় BITএবং সমর্থন করে TINYINT। MyBatis এর JdbcType শ্রেণি, mybatis.org/mybatis-3/apidocs/references/org/apache/ibatis/type/… দেখুন
ভাগ্যবান

1
@ বিডিজ আমি আপনাকে বিআইটি (1) এর উল্লেখ করার জন্য প্লাস একটি দিচ্ছি তবে এটি পড়ার বিকাশকারীদেরও উল্লেখ করব - অ্যাপ্লিকেশন স্তর / ডেটা অ্যাক্সেস লেয়ারে থাকা আপনার ভাষাটি জানুন এবং আপনার লাইব্রেরি সমর্থন জানুন know আমি বর্তমানে জাভা ব্যবহার করছি এবং হাইবারনেট এবং জেডিবিসির মতো লাইব্রেরিগুলির জন্য বিআইটি (1) এই সময়ে প্রস্তাবিত পছন্দ। এখানে ইউআরএল [টেবিল 5.2 দেখুন]: dev.mysql.com/doc/connector-j/en/…
জ্যাক জান্নসেন

6

যেহেতু মাইএসকিউএল (8.0.16) এবং মারিয়াডিবি (10.2.1) উভয়ই চেক সীমাবদ্ধতা প্রয়োগ করেছে, এখন আমি ব্যবহার করব

bool_val TINYINT CHECK(bool_val IN(0,1))

আপনি শুধুমাত্র দোকান করতে সক্ষম হবে 0, 1বা NULLমান যা রূপান্তরিত করা যেতে পারে, পাশাপাশি 0বা 1মত ত্রুটি ছাড়া '1', 0x00, b'1'বা TRUE/ FALSE

আপনি যদি NULLs এর অনুমতি দিতে না চান তবে NOT NULLবিকল্পটি যুক্ত করুন

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

মনে রাখবেন যে আপনি ব্যবহার করলে কার্যত কোনও পার্থক্য নেই TINYINT, TINYINT(1)বা TINYINT(123)

আপনি যদি চান যে আপনার স্কিমা উপরের দিকে সামঞ্জস্যপূর্ণ হয়, আপনি এটি ব্যবহার করতে পারেন BOOLবাBOOLEAN

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

ডিবি <> ফিডাল ডেমো



3
@ সান্টিয়াগোরিজিটি ENUM(এটি অবশ্যই হওয়া উচিত enum('0', '1')- দ্রষ্টব্য: সেগুলি স্ট্রিংগুলি) ভাল ধারণা নয়। আছে অনেকগুলি বিষয় কিভাবে এটা অভ্যন্তরীণভাবে সংরক্ষিত হয়, এবং কিভাবে অ স্ট্রিং মান চিকিত্সা করা হয় কারণে। যেমন। 0এবং FALSE সংরক্ষণ করা যাবে না। 1এবং TRUEহয়ে '0'। এবং 2হয় '1'
পল স্পিগেল

সবচেয়ে ভালো উত্তর ... এই ব্যবহার মাইএসকিউএল 8+ জন্য
পাথরের টেবিল

2

উত্তরগুলি পড়ার পরে আমি ব্যবহার করার সিদ্ধান্ত নিয়েছি bit(1) এবং হ্যাঁ, এটা একরকম ভাল স্থান / সময় আছে, কিন্তু পরে একটি যখন আমি আমার মন পরিবর্তন এবং আমি তা আবার ব্যবহার করবে না। প্রস্তুত বিবৃতি, গ্রন্থাগার ইত্যাদি ব্যবহার করার সময় এটি আমার বিকাশকে অনেক জটিল করে তুলেছিল ph

সেই থেকে, আমি সবসময় ব্যবহার করি tinyint(1), যথেষ্ট ভাল বলে মনে হচ্ছে।


3
কীভাবে এটি আপনার বিকাশকে জটিল করে তুলেছে তা বোঝানোর জন্য যত্নশীল?
চাজি চাজ

@ চাজিচাজ এটি এসকিউএল সার্ভারের মতো অন্য কিছু ডাবসের বিপরীতে 1/0 এর পরিবর্তে সত্য / মিথ্যা প্রত্যাশা করে। এটি কখনও কখনও এমন অদ্ভুত পরিস্থিতিতে ডেকে আনতে পারে যেখানে আপনি মনে করেন আপনি এটিকে সত্যে সেট করছেন তবে বাস্তবে তা ঘটে না।
ma mambe

0

আপনি বুলিয়ান মান সংরক্ষণের জন্য বোল, বুলিয়ান ডেটা টাইপ ব্যবহার করতে পারেন।

এই ধরণেরগুলি TINYINT (1) এর প্রতিশব্দ

যাইহোক, বিআইটি (1) ডেটা টাইপ বুলিয়ান মান (সত্য ([1] বা মিথ্যা [0]) সংরক্ষণ করার জন্য আরও তাত্পর্যপূর্ণ করে তোলে তবে আপনি যখন ডাটা আউটপুট করছেন, কোয়েরি করছেন এবং ঠিক তেমনই কাজ করা সহজ TINYINT (1) এবং মাইএসকিউএল এবং অন্যান্য ডাটাবেসগুলির মধ্যে আন্তঃআযোগিতা অর্জন করতে। আপনি পরীক্ষা করতে পারেন এই উত্তর বা থ্রেডও

মাইএসকিউএলও বিওএল, বুলিয়ান ডেটা টাইপগুলি টিনআইএনটি (1) এ রূপান্তর করে।

আরও, ডকুমেন্টেশন পড়ুন

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