কেন ওরাকল 9 আই খালি স্ট্রিংটিকে নুল হিসাবে গণ্য করে?


216

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

অনুমান করতে নির্দ্বিধায়, তবে দয়া করে যদি এটি হয় তবে এটি নির্দেশ করুন। ওরাকল থেকে এমন কেউ যদি মন্তব্য করতে পারে তবে তা দুর্দান্ত হবে!


9
অনুমান করতে নির্দ্বিধায়? কোনওভাবেই আমি মনে করি না যে এটি আপনাকে উত্তরগুলির সর্বাধিক সেট সরবরাহ করবে ..
এসসিডিএফ

1
আমি মনে করি না, তবে আমি নিশ্চিত ছিলাম না যে বিষয়টি সম্পর্কে কোনও নিশ্চিততা থাকবে, তাই আমি বুঝতে পেরেছিলাম যে আমি দরজা খুলে ফেলব। এখন পর্যন্ত ঠিকঠাক কাজ করেছে বলে মনে হচ্ছে।
ক্রিস আর


উত্তর:


216

আমি বিশ্বাস করি উত্তরটি হ'ল ওরাকল খুব, খুব পুরানো।

পুরানো দিনগুলিতে ফিরে এসকিউএল স্ট্যান্ডার্ড হওয়ার আগে, ওরাকল ডিজাইনের সিদ্ধান্ত নিয়েছিল যে VARCHAR/ VARCHAR2কলামগুলিতে খালি স্ট্রিং রয়েছে NULLএবং সেখানে ন্যূনাল একটি মাত্র ধারণা রয়েছে (এমন রিলেশনাল থিওরিস্ট রয়েছে যা এমন ডেটার মধ্যে পার্থক্য করতে পারে যা কখনই জিজ্ঞাসা করা হয়নি, ডেটা যেখানে উত্তর বিদ্যমান কিন্তু ব্যবহারকারীর দ্বারা জানা যায় না, যেখানে কোনও উত্তর নেই এমন ডেটা, যার মধ্যে কিছুটা বোঝা যায় NULL)।

এসকিউএল স্ট্যান্ডার্ডটি প্রায় এসেছিল এবং তাতে সম্মত হয়েছিল যে NULLএবং খালি স্ট্রিংটি স্বতন্ত্র সত্তা ছিল, ইতিমধ্যে ওরাকল ব্যবহারকারীরা কোড পেয়েছিলেন যে দুটি সমতুল্য বলে ধরে নিয়েছে। সুতরাং ওরাকলকে মূলত বিদ্যমান কোড ভাঙার, এসকিউএল স্ট্যান্ডার্ড লঙ্ঘন করার বা এমন কিছু প্রারম্ভিক পরামিতি প্রবর্তন করার সম্ভাবনা রয়েছে যা সম্ভাব্য সংখ্যক কোয়েরির কার্যকারিতা পরিবর্তন করবে। এসকিউএল স্ট্যান্ডার্ড (আইএমএইচও) লঙ্ঘন করা এই তিনটি বিকল্পের মধ্যে সর্বনিম্ন ব্যাঘাত ঘটাচ্ছে।

ওরাকল VARCHARএসকিউএল স্ট্যান্ডার্ডকে মেনে চলার জন্য ভবিষ্যতের রিলিজে ডেটা টাইপ পরিবর্তিত হওয়ার সম্ভাবনাটি ছেড়ে দিয়েছে (যার কারণেই VARCHAR2এই ডাটা টাইপের আচরণ একইভাবে এগিয়ে যাওয়ার গ্যারান্টিযুক্ত যেহেতু সবাই ওরাকলে ব্যবহার করেন)।


60

ওরাকল এর টম কিট ভিপি:

একটি শূন্য দৈর্ঘ্যের বর্ণচরকে NULL হিসাবে ধরা হয়।

'' কে NULL হিসাবে বিবেচনা করা হয় না।

'' যখন কোনও চরকে বরাদ্দ করা হয় (1) হয়ে যায় '' (চর প্রকারগুলি ফাঁকা প্যাডযুক্ত স্ট্রিং থাকে)।

'' যখন ভার্চর 2 (1) এর জন্য নির্ধারিত হয় তখন '' হয়ে যায় 'যা শূন্য দৈর্ঘ্যের স্ট্রিং এবং শূন্য দৈর্ঘ্যের স্ট্রিং ওরাকলে ন্যূনাল হয় (এটি দীর্ঘ নয়' ')


17
বাহ, টম এর সুন্দর সুন্দর। প্রশ্নগুলি এসকিউএল 92-এর একটি বিভ্রান্তিকর পরিবর্তনের সাথে সম্পর্কিত, আপনি মনে করেন যে তিনি এ সম্পর্কে কম ঘৃণ্য হবেন ... যদিও তিনি উত্তর দিতে ক্লান্ত হয়ে পড়েছেন।
ক্রিস আর

8
টম সম্পর্কে সর্বোত্তম জিনিসটি হ'ল আপনি একটি স্পষ্ট উত্তর পেয়ে যা, যা তিনি যা মনে করেন ঠিক তা বলে । লোকেরা জিজ্ঞাসা করা টম
ক্রিস গিল-এ

9
তবে এটি আরও সুনির্দিষ্ট হবে যদি দ্বিতীয় লাইনটি '' এ
ypercubeᵀᴹ

2
@ টাইপব্যুব টম প্রকৃতপক্ষে ব্যবহৃত শব্দটি পরিবর্তন করে উদ্ধৃতিটি আরও সঠিকভাবে পায় না। আপনি যদি মনে করেন টম এটিকে বিভ্রান্তিমূলকভাবে শব্দ করেছেন, মিমি। হতে পারে. আমার মনে হয় সে স্পট করেছে । সবচেয়ে বিভ্রান্তিকর পরিস্থিতিতে উঠা যখন ''হচ্ছে implicitely একটি VARCHAR2, রূপান্তরিত যেমন cast('' as char(1)) is nullযা ... আশ্চর্যজনক সত্য
sehe

1
@ আমার জন্য বিভ্রান্তিকর বিটটি দ্বৈত থেকে প্রথম নির্বাচন করুন যেখানে ('' নাল)
ম্যাট ফ্রিকে

20

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


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

19

ওরাকল ডকুমেন্টেশন বিকাশকারীদের এই সমস্যাটি সম্পর্কে সতর্ক করে, কমপক্ষে সংস্করণ 7 হিসাবে ফিরে।

ওরাকল "অসম্ভব মান" কৌশলটি দ্বারা NULLS প্রতিনিধিত্ব করতে বেছে নিয়েছে। উদাহরণস্বরূপ, একটি সংখ্যাসূচক অবস্থানের একটি NULL "বিয়োগ শূন্য" হিসাবে সংরক্ষণ করা হবে, একটি অসম্ভব মান। গণনা থেকে প্রাপ্ত যে কোনও বিয়োগ শূন্যগুলি সংরক্ষণের আগে ধনাত্মক শূন্যে রূপান্তরিত হবে।

ওরাকলও ভ্রুনার্কের লম্বা শূন্যের ভ্রচার স্ট্রিং (খালি স্ট্রিং )টিকে একটি অসম্ভব মান হিসাবে বিবেচনা করার জন্য এবং NULL উপস্থাপনের জন্য উপযুক্ত পছন্দ হিসাবে বেছে নিয়েছিল। দেখা যাচ্ছে যে খালি স্ট্রিংটি একটি অসম্ভব মান থেকে অনেক দূরে। এমনকি স্ট্রিং কনটেনটেশন অপারেশনের অধীনে এটি পরিচয়!

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

অসম্ভব মানগুলি বাদে নুলকে পতাকাঙ্কিত করার কৌশল রয়েছে তবে ওরাকল সেগুলি ব্যবহার করেন নি।

(আমি সারি এবং একটি কলামের ছেদটি বোঝার জন্য উপরে "অবস্থান" শব্দটি ব্যবহার করছি))


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


2

খালি স্ট্রিং NUL এর সমান কারণ কেবল যখন দুটি (খালি স্ট্রিং এবং নাল) এক নয় তখন পরিস্থিতির তুলনায় যখন এটি "কম দুষ্ট" হয়।

যে ভাষাগুলিতে NULL এবং খালি স্ট্রিং একই নয়, সেখানে সর্বদা উভয় শর্তাদি পরীক্ষা করতে হবে।


কেবল not nullআপনার কলামে সীমাবদ্ধতা সেট করুন এবং খালি স্ট্রিংয়ে পরীক্ষা করুন।
ডিম স্ক্রিপটুনফ

6
উভয় শর্ত পরীক্ষা করা তুচ্ছ: WHERE Field <> ''যদি ক্ষেত্রটি শূন্য থাকে না এবং খালি না হয় তবেই সত্য ফিরে আসে, খালি স্ট্রিংয়ের জন্য এএনএসআই আচরণের ডেটাবেজে।

1

অফিসিয়াল 11 জি ডক্স অনুসারে

ওরাকল ডেটাবেস বর্তমানে শূন্য দৈর্ঘ্যের সাথে একটি অক্ষরের মান শূন্য হিসাবে বিবেচনা করে। তবে ভবিষ্যতে প্রকাশিত ক্ষেত্রে এটি সত্য হতে পারে না এবং ওরাকল আপনাকে খালি স্ট্রিংগুলি নালার মতো ব্যবহার না করার পরামর্শ দেয়।

সম্ভাব্য কারণ

  1. val IS NOT NULL এর চেয়ে বেশি পঠনযোগ্য val != ''
  2. উভয় শর্ত পরীক্ষা করার প্রয়োজন নেই val != '' and val IS NOT NULL

5
পুরোপুরি এএনএসআই-কমপ্লায়েন্ট ডাটাবেসে আপনাকে উভয় শর্ত পরীক্ষা করতে হবে না। val <> ''ইতিমধ্যে বাদ দেওয়া হয়েছে NULL। সম্ভবত আপনি বোঝানো হয়েছে val = '' OR val IS NULL। কিন্তু খালি স্ট্রিংগুলি যেগুলি NUL হিসাবে তুলনা করে না দরকারী !
এরিক

আমি তুলনা অংশের সাথে একমত।
নির্বাচক

0

বই থেকে উদাহরণ

   set serveroutput on;   
    DECLARE
    empty_varchar2 VARCHAR2(10) := '';
    empty_char CHAR(10) := '';
    BEGIN
    IF empty_varchar2 IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_varchar2 is NULL');
    END IF;


    IF '' IS NULL THEN
    DBMS_OUTPUT.PUT_LINE(''''' is NULL');
    END IF;

    IF empty_char IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_char is NULL');
    ELSIF empty_char IS NOT NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_char is NOT NULL');
    END IF;

    END;

-1

কারণ এটিকে নুল হিসাবে চিকিত্সা করা বিশেষত সহায়ক নয়।

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

আমি বলছি না ওরাকল সঠিক, তবে আমার কাছে মনে হয় যে দুটি উপায় প্রায় সমানভাবে খারাপ।


2
ডিবাগ করা আরও অনেক সহজ। এছাড়াও, আপনি যদি স্ক্রিনে একটি খালি ঘর বা ইনপুট দেখেন তবে আপনি জানেন যে ডিবিতে থাকা ডেটা নাল। অন্যান্য ডিবিতে যেখানে '' <> নুল, সেখানে ডেটা নাল বা '' থাকলে আপনি "দেখতে" পারবেন না, এটি খুব স্পিনযুক্ত বাগগুলিতে নিয়ে যায়। '' = নালাগুলি এটি সানেষ্ট বিকল্প, এমনকি যদি এটি স্ট্যান্ডার্ড না হয়।
লুসিও এম টাটো

2
"অন্যান্য ডিবিতে যেখানে '' <> নুল, সেখানে ডেটা নাল বা ''" "=> আপনি" দেখতে পারবেন না "=> সাধারণত, ডিবি সরঞ্জামগুলি শূন্য স্ট্রিং থেকে পৃথকভাবে NULL প্রদর্শন করে। প্রকৃতপক্ষে, এমনকি ওরাকল এসকিউএল বিকাশকারী নুলকে "(নাল)" হিসাবে দেখায়। আমার ধারণা এটি হ'ল স্পেস থেকে নুলকে আলাদা করতে পারে তবে এটি NUL এবং খালি স্ট্রিংয়ের মধ্যে পার্থক্যের সাথে সম্পর্কিত নয়।
দিদিয়ের এল

-6

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

NULLs লিঙ্কগুলিতে ওরাকল হ্যান্ডলিং:

http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/

http://jeffkemponoracle.com/2006/02/empty-string-andor-null.html


1
অবৈধ ডাটাটিম মান? এই এটা দেখে মনে হচ্ছে কি না। আপনি কি এখানে একটি প্রশ্ন হিসাবে পোস্ট করেছেন?

1
সমস্যা পূর্ব-তারিখযুক্ত স্ট্যাকওভারফ্লো - আমি ওরাকল ফোরামগুলি থেকে কোনও দরকারী তথ্য পাইনি এবং আমি একটি কার্যনির্বাহ তৈরি করেছি - আমি আমার নোটগুলি এখানে ট্র্যাক করব এবং এখানে পোস্ট করব।
ক্যাড রক্স

এখানে একটি প্রশ্ন হিসাবে বিশদ পোস্ট।
ক্যাড রক্স

-6

প্রথমত, নাল এবং নাল স্ট্রিং সবসময় ওরাকল দ্বারা একই হিসাবে ধরা হয় নি। একটি নাল স্ট্রিং, সংজ্ঞা অনুসারে, একটি স্ট্রিং যার কোনও অক্ষর নেই। এটি মোটেও নালার মতো নয়। NULL, সংজ্ঞা অনুসারে, তথ্যের অনুপস্থিতি।

পাঁচ বা ছয় বছর বা তারও আগে, নাকের স্ট্রিংটি ওরাকল দ্বারা নাল থেকে পৃথকভাবে আচরণ করা হয়েছিল। নালকের মতো নাল স্ট্রিং সব কিছুর সমান এবং সবকিছু থেকে পৃথক ছিল (যা আমি নালকে ভাল বলে মনে করি, তবে নাল স্ট্রিংয়ের জন্য পুরোপুরি WRONG), কমপক্ষে দৈর্ঘ্য (নাল স্ট্রিং) 0 ফিরে আসবে, যেহেতু নাল স্ট্রিংটি হওয়া উচিত শূন্য দৈর্ঘ্যের একটি স্ট্রিং।

বর্তমানে ওরাকলে, দৈর্ঘ্য (নাল) নাল দেয় যা আমি অনুমান করি যে ঠিক আছে, তবে দৈর্ঘ্য (নাল স্ট্রিং) নালও দেয় যা সম্পূর্ণ ভুল R

তারা কেন এই 2 স্বতন্ত্র "মান" এর সাথে একই আচরণ শুরু করার সিদ্ধান্ত নিয়েছে তা আমি বুঝতে পারি না। তারা বিভিন্ন জিনিস বোঝায় এবং প্রোগ্রামারটির প্রতিটিটিতে বিভিন্ন উপায়ে অভিনয় করার ক্ষমতা থাকা উচিত। তারা তাদের পদ্ধতিটি পরিবর্তিত করেছে এই বিষয়টি আমাকে বলে যে এই মানগুলি কীভাবে আচরণ করা উচিত সে সম্পর্কে তাদের আসলেই কোনও ধারণা নেই।


"নাল স্ট্রিং" এবং NULL মানের মধ্যে পার্থক্য তৈরি করার জন্য উদ্ধৃতি আবশ্যক। ওরাকল ব্যতীত অন্য কোনও ডাটাবেসে কোনও VARCHARক্ষেত্রে একটি মান (শূন্য বা আরও বেশি অক্ষর) বা কোনও মান (NULL), পুরো স্টপ থাকতে পারে।

২০১১ সাল থেকে "পাঁচ বা ছয় বছর আগে" 10 জি টাইমফ্রেমে (2003 সালে প্রকাশিত 10.1, 2005 সালে 10.2) পড়বে। 10 জি নুলগুলি সামলানোর ক্ষেত্রে বিশ্বব্যাপী কোনও পরিবর্তন আনেনি, এবং কোনও NULLনাল মূল্যবান স্ট্রিংয়ের মধ্যে কখনও কোনও পার্থক্য দেখা যায়নি এবং এরকম পার্থক্য কোনও অর্থবোধ করে না। আমি ভয় করি যে এই উত্তরটি সম্পূর্ণ ফ্যান্টাসি is
উইলিয়াম রবার্টসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.