কখন NULL ব্যবহার করবেন এবং কখন খালি স্ট্রিং ব্যবহার করবেন?


82

আমি মূলত মাইএসকিউএল এবং পোস্টগ্রেএসকিউএল-তে আগ্রহী, তবে আপনি সাধারণভাবে নিম্নলিখিতটির উত্তর দিতে পারেন:

  • এমন কোনও যৌক্তিক দৃশ্যাবলী রয়েছে যাতে কোনও শূন্য পংক্তিটি NUL থেকে আলাদা করার জন্য এটি কার্যকর হবে?
  • খালি স্ট্রিং হিসাবে সংরক্ষণের জন্য শারীরিক স্টোরেজ এর কী কী প্রভাব পড়বে ...

    • খালি?
    • খালি স্ট্রিং?
    • আর মাঠ?
    • অন্য কোন উপায়?

উত্তর:


67

যাক যে রেকর্ডটি নাম এবং ঠিকানার তথ্য সংগ্রহ করার জন্য একটি ফর্ম থেকে আসে। যদি ব্যবহারকারী অ্যাপার্টমেন্টে না থাকেন তবে ঠিকানাটির লাইন 2 সাধারণত ফাঁকা থাকবে। এই ক্ষেত্রে একটি খালি স্ট্রিং পুরোপুরি বৈধ। আমি মানটি অজানা বা দেওয়া হয়নি তার অর্থ NUL ব্যবহার করতে পছন্দ করি।

আমি বিশ্বাস করি না যে শারীরিক স্টোরেজ পার্থক্যটি অনুশীলনে চিন্তিত। ডাটাবেস প্রশাসক হিসাবে, আমাদের ভাজার মতো আরও অনেক বড় মাছ রয়েছে!


2
+1 টি খুব কম DBA এর কি কখনো ব্যবহার করার গতি / আকার পার্থক্য সম্পর্কে চিন্তা করতে হবে NULLনা
প্যাট্রিক

28
সম্মত ... আমি 'অচেনা'র জন্য NULL রিজার্ভ করার চেষ্টা করি ... খালি স্ট্রিংটি' আমরা জানি এটি খালি হওয়া উচিত '। আপনার ডেটা একাধিক উত্স থেকে আসার জন্য এটি বিশেষভাবে কার্যকর
জো

6
বকেয়া - NULL জানা যায়নি, খালি স্ট্রিং নির্দিষ্ট করা হয়েছিল।
স্কটচের

@ ল্যারি পারফরম্যান্সের প্রভাব কী? অনেকগুলি সারিগুলির বনাম টেবিলের তুলনায় বহু কোলের টেবিলের সাথে পারফরম্যান্স কীভাবে আলাদা হয়?
শিমি

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

25

আমি মাইএসকিউএল এবং পোস্টগ্রেএসকিউএল সম্পর্কে জানি না, তবে আমাকে এটিকে কিছুটা সাধারণভাবে আচরণ করতে দিন।

ওরাকল নামে একটি ডিবিএমএস রয়েছে যা এটি NUL এবং '' এর মধ্যে ব্যবহারকারীদের বেছে নিতে দেয় না। এটি স্পষ্টতই প্রমাণ করে যে উভয়ের মধ্যে পার্থক্য করা প্রয়োজন নয়। কিছু বিরক্তিকর পরিণতি রয়েছে:

আপনি একটি খালি স্ট্রিংয়ের জন্য একটি ভারচার 2 সেট করেছেন:

Update mytable set varchar_col = '';

নিম্নলিখিত একই ফলাফল বাড়ে

Update mytable set varchar_col = NULL;

তবে কলামগুলি নির্বাচন করতে যেখানে মানটি শূন্য বা নাল রয়েছে, আপনাকে ব্যবহার করতে হবে

select * from mytable where varchar_col is NULL;

ব্যবহার

select * from mytable where varchar_col = '';

সিনথেটিকভাবে সঠিক, তবে এটি কখনও সারি দেয় না।

অন্যদিকে, ওরাকলে স্ট্রিংগুলি সংযুক্ত করার সময়। NULL ভারচারগুলি খালি স্ট্রিং হিসাবে বিবেচিত হয়।

select NULL || 'abc' from DUAL;

ফলন abc । অন্যান্য ডিবিএমএস এই ক্ষেত্রে NULL ফেরত দেবে।

আপনি যখন স্পষ্টভাবে প্রকাশ করতে চান, একটি মান নির্ধারিত হয়, আপনাকে '' এর মতো কিছু ব্যবহার করতে হবে।

এবং আপনাকে উদ্বেগ করতে হবে যে ট্রামিংয়ের কারণে খালি ফলাফলগুলি নূলে নেই

select case when ltrim(' ') is null then 'null' else 'not null' end from dual

এটা করে.

এখন ডিবিএমএসের দিকে তাকানো যেখানে '' নুলের সাথে মিল নেই (যেমন এসকিউএল-সার্ভার)

'' এর সাথে কাজ করা সাধারণত সহজ এবং বেশিরভাগ ক্ষেত্রে উভয়ের মধ্যে পার্থক্য করার কোনও ব্যবহারিক প্রয়োজন নেই। আমার জানা ব্যতিক্রমগুলির মধ্যে একটি হল যখন আপনার কলামটি কিছু সেটিংস উপস্থাপন করে এবং আপনার সেগুলির জন্য খালি ডিফল্ট না থাকে। আপনি যখন '' এবং NULL এর মধ্যে পার্থক্য করতে পারবেন আপনি নিজের সেটিংসটি খালি রয়েছে তা প্রকাশ করতে সক্ষম হন এবং ডিফল্ট প্রযোজ্য তা এড়াতে পারবেন।


সম্পর্কিত: stackoverflow.com/questions/203493/…
জো

17

এটি আপনি যে ডোমেনে কাজ করছেন তার উপর নির্ভর করে। NULLমানে মানের অনুপস্থিতি (অর্থাত্ কোনও মান নেই ), খালি স্ট্রিং মানে শূন্য দৈর্ঘ্যের একটি স্ট্রিং মান থাকে

উদাহরণস্বরূপ, বলুন যে কোনও ব্যক্তির ডেটা সঞ্চয় করার জন্য আপনার কাছে একটি টেবিল রয়েছে এবং এতে একটি Genderকলাম রয়েছে । আপনি মানগুলি 'পুরুষ' বা 'মহিলা' হিসাবে সংরক্ষণ করতে পারেন। ব্যবহারকারী লিঙ্গ তথ্য প্রদান না করে করতে সক্ষম হয়, তাহলে আপনি সংরক্ষণ করা উচিত যে হিসাবে NULLএবং (অর্থাত ব্যবহারকারী মান প্রদান না) না খালি স্ট্রিং (যেহেতু সেখানে 'মান সঙ্গে কোন লিঙ্গ' হল)।


7
যদি ব্যবহারকারী কোনও লিঙ্গ সরবরাহ না করা বেছে নেয়, অবশ্যই আপনার "সরবরাহ করতে অস্বীকার" সংরক্ষণ করা উচিত। NULL অস্পষ্ট; এর অর্থ "গ্রাহককে জিজ্ঞাসা করা হয়নি", "গ্রাহক আমাদের লিস্টে নেই এমন লিঙ্গ দিয়ে চিহ্নিত করেন" ইত্যাদিও হতে পারে
জোন অফ অল ট্রেডস

8

একটি বিষয় মনে রাখা উচিত যে আপনার যখন এমন একটি ক্ষেত্র রয়েছে যা প্রয়োজন নেই, তবে যে মানগুলি অবশ্যই উপস্থিত তা অনন্য হতে হবে আপনার খালি মানগুলি NULL হিসাবে সংরক্ষণ করতে হবে। অন্যথায়, আপনি কেবলমাত্র সেই ক্ষেত্রের খালি মান সহ একটি টিপল রাখতে সক্ষম হবেন।

রিলেশনাল বীজগণিত এবং নুল মানগুলির সাথে কিছু পার্থক্য রয়েছে: উদাহরণস্বরূপ, NULL! = NULL।


4
এটি আসলে নুল! = নুল নয়, কারণ এটি নুল। ;-)
পিটার আইসেন্ট্রাট

1
নোট করুন যে এমএস এসকিউএল এই নিয়মটি অনুসরণ করে না: একাধিক নুল মান একটি UNIQUEসীমাবদ্ধতা লঙ্ঘন করবে । ভাগ্যক্রমে, ২০০৮ থেকে শুরু করে আপনি সঠিক আচরণ পেতে একটি ফিল্টার সূচক ব্যবহার করতে পারেন।
সমস্ত ট্রেডের জোন

6

আপনি ডিউটির এনএলএল সম্পর্কে সমালোচনা এবং এসকিউএল এবং রিলেশনাল থিওরিতে 3VL এর সমস্যাগুলির কারণ (এবং রুবিনসনের তারিখের সমালোচনা, নালস, তিন-মূল্যবান যুক্তি এবং এসকিউএল-তে দ্বিচারিতা: সমালোচনার তারিখের সমালোচনা ) তৈরি করতে পারেন।

উভয়ই সম্পর্কিত এসও থ্রেডে দৈর্ঘ্যে রেফারেন্স এবং আলোচনা করা হয়, একটি ডিবি মডেল থেকে নুয়েবল কলামগুলি অপসারণের জন্য বিকল্পগুলি


4

আপনি যদি কোনও কাঠামো ব্যবহার করছেন তবে একটি নতুন চিন্তাধারা, আপনার পছন্দ NULL/ এর উপর একটি বড় প্রভাব NOT NULL। আমি সিমেফনি অনেকটা ব্যবহার করি এবং NULLক্ষেত্রগুলি ব্যবহারের মাধ্যমে ডেটা ম্যানিপুলেট করার সময় কিছু কোড এবং ডেটা চেকিং সহজ করে।

আপনি যদি কোনও ফ্রেমওয়ার্ক ব্যবহার না করে থাকেন বা আপনি যদি সাধারণ এসকিএল স্টেটমেন্ট এবং প্রসেসিং ব্যবহার করছেন তবে আপনি যে কোনও পছন্দ বজায় রাখতে সহজ মনে করেন with আমি সাধারণত নুলকে পছন্দ করি যাতে INSERTবিবৃতিগুলি খালি ক্ষেত্রগুলিতে সেট করতে ভুলে গিয়ে বিরক্ত না হয় NULL


প্রশ্নটি NULL বনাম খালি স্ট্রিং সম্পর্কে (একটি নমনীয় কলামে, IMO) নয়, NULL বনাম NULL নয়, তাই না?
গণ

স্টোরেজ সম্পর্কে জিজ্ঞাসা করা প্রশ্নের অংশটি আমাকে ভাবতে পরিচালিত করেছিল যে সে নাল / নট নাল সম্পর্কেও ভাবতে পারে
প্যাট্রিক

বা @ প্রত্যেকটিই NULL বনাম NULL এর জড়িত সম্পর্কে, আপনি এইটি
গণ

2

ওরাকল ( যা আপনাকে আলাদা করতে দেয় না ) এর সাথে কাজ করার পরে আমি নিম্নলিখিত সিদ্ধান্তে পৌঁছেছি:

  • লজিকাল পিওভি থেকে এটি কোনও ব্যাপার নয়। আমি সত্যিই একটি বাধ্যমূলক উদাহরণের কথা ভাবতে পারি না যেখানে NUL এবং শূন্য-দৈর্ঘ্যের স্ট্রিংয়ের মধ্যে পার্থক্য ডিবিএমএসে কোনও মান যুক্ত করে।

  • যার থেকে নিম্নলিখিতটি অনুসরণ করা হয়: আপনি হয় একটি NULLসক্ষম কলাম যা শূন্য-লেন ''(ওরাকল-ইশ সমাধান) বা একটি NOT NULLকলাম যা শূন্য-লেনকে অনুমতি দেয় না।

  • এবং আমার অভিজ্ঞতা থেকে ''তোলে অনেক সংযুক্তকরণ তুলনা ইত্যাদি: আরও অর্থে ডেটা প্রক্রিয়াকরণের, সাধারণত হিসাবে আপনি খালি স্ট্রিং হিসেবে একটি স্ট্রিং অভাবে প্রক্রিয়া করতে চাই

দ্রষ্টব্য: আমার ওরাকল অভিজ্ঞতায় ফিরে যেতে: বলুন আপনি কোনও অনুসন্ধানের অনুরোধের জন্য একটি প্রশ্ন তৈরি করতে চান। আপনি যদি ব্যবহার করেন তবে ''আপনি কেবল উত্পন্ন করতে পারবেন WHERE columnX = <searchvalue>এবং এটি সমতা অনুসন্ধানের জন্য কাজ করবে। আপনি যদি ব্যবহার করেন তবে NULLআপনাকে করতে হবে WHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL)। বাঃ! :-)


2

এগুলি ডিজাইনের দৃষ্টিকোণ থেকে পৃথক:

যেমন

CREATE TABLE t (
    id INTEGER  NOT NULL,
    name CHARACTER(40),
    CONSTRAINT t_PK PRIMARY KEY (id)
);

CREATE UNIQUE INDEX t_AK1 ON t (name);

দেখতে:

 \d t
          Table "public.t"
 Column |     Type      | Modifiers
--------+---------------+-----------
 id     | integer       | not null
 name   | character(40) |
Indexes:
    "t_pk" PRIMARY KEY, btree (id)
    "t_ak1" UNIQUE, btree (name)

কিছু তথ্য সন্নিবেশ করান:

op=# insert into t(id, name ) values ( 1, 'Hello');
INSERT 0 1

op=# insert into t( id, name) values ( 2, '');
INSERT 0 1

op=# insert into t( id, name) values ( 3, '');

ERROR:  duplicate key value violates unique constraint "t_ak1"

এখন নাল দিয়ে চেষ্টা করুন:

op=# insert into t( id, name) values (4, null );

INSERT 0 1

op=# insert into t( id, name) values (5, null);

INSERT 0 1

এটি অনুমোদিত।

Soooooo: নালগুলি তুচ্ছ স্ট্রিং বা বিপরীত নয়।

চিয়ার্স


1

যদি আমরা তত্ত্বের বিষয়ে কথা বলি, তবে কোডডের বিধিগুলি বলে যে আরডিবিএমএসকে অবশ্যই NULLমানগুলি একটি বিশেষ উপায়ে আচরণ করবে treat

প্রকৃত ডোমেন - টাস্ক - প্রকল্প - অ্যাপ্লিকেশন - ক্ষেত্রের উপর নির্ভর করে এটি কীভাবে ব্যবহৃত হয় তা ডাটাবেস স্থপতিদের উপর নির্ভর করে।

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