لماذا يتعامل Oracle 9i مع سلسلة فارغة على أنها NULL؟

StackOverflow https://stackoverflow.com/questions/203493

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أعلم أنه يفعل اعتبر ' ' كـ NULL, ، لكن هذا لا يعني الكثير ليخبرني به لماذا هذا هو الحال.كما أفهم مواصفات SQL، فإن ' ' ليس هو نفسه NULL -- أحدهما مرجع صحيح، والآخر يشير إلى عدم وجود نفس المعلومات.

لا تتردد في التكهن، ولكن يرجى توضيح ما إذا كان هذا هو الحال.إذا كان هناك أي شخص من Oracle يمكنه التعليق عليه، فسيكون ذلك رائعًا!

هل كانت مفيدة؟

المحلول

أعتقد أن الإجابة هي أن Oracle قديمة جدًا.

في الأيام الخوالي قبل وجود معيار SQL، اتخذت Oracle قرار التصميم بإفراغ السلاسل VARCHAR/VARCHAR2 كانت الأعمدة NULL وأن هناك إحساسًا واحدًا فقط بـ NULL (هناك منظرون علائقيون يفرقون بين البيانات التي لم تتم المطالبة بها مطلقًا، والبيانات التي توجد بها الإجابة ولكن لا يعرفها المستخدم، والبيانات التي لا توجد بها إجابة، وما إلى ذلك.وكلها تشكل نوعا من الشعور NULL).

بحلول الوقت الذي ظهر فيه معيار SQL ووافق على ذلك NULL وكانت السلسلة الفارغة عبارة عن كيانات متميزة، وكان هناك بالفعل مستخدمو Oracle لديهم كود يفترض أن الاثنين متساويان.لذلك، تُركت Oracle بشكل أساسي مع خيارات كسر التعليمات البرمجية الموجودة، أو انتهاك معيار SQL، أو تقديم نوع من معلمات التهيئة التي من شأنها تغيير وظائف عدد كبير محتمل من الاستعلامات.كان انتهاك معيار SQL (IMHO) هو الأقل إزعاجًا بين هذه الخيارات الثلاثة.

لقد تركت أوراكل الباب مفتوحًا أمام احتمال أن يكون VARCHAR سيتغير نوع البيانات في إصدار مستقبلي للالتزام بمعيار SQL (وهذا هو سبب استخدام الجميع VARCHAR2 في Oracle حيث يُضمن أن يظل سلوك نوع البيانات هذا كما هو من الآن فصاعدًا).

نصائح أخرى

وأظن أن هذا يجعل الكثير من المعنى إذا كنت تعتقد أوراكل الطريق ربما لم المطورين في وقت سابق - باعتباره الخلفية الممجدة لنظام إدخال البيانات. كل حقل في قاعدة البيانات يتفق مع حقل في شكل مشغل إدخال البيانات وشهد على شاشته. إذا لم المشغل اكتب أي شيء في حقل، سواء كان ذلك في "تاريخ الميلاد" أو "عنوان" ثم البيانات لهذا الحقل هو "غير معروف". ليس هناك طريقة للعامل للإشارة إلى عنوان شخص ما هو في الحقيقة سلسلة فارغة، وهذا لا يجعل حقا معنى كبير على أي حال.

وثائق Oracle تنبيه المطورين لهذه المشكلة، والعودة على الأقل بقدر الإصدار 7.

واختار أوراكل لتمثيل بالقيم الخالية بواسطة تقنية "قيمة مستحيلة". على سبيل المثال، يتم تخزين فارغة في موقع رقمي باسم "صفر ناقص"، قيمة مستحيلة. سيتم تحويل أي أصفار ناقص التي تنتج عن الحسابات إلى إيجابي الصفر قبل أن يتم تخزينها.

وكما اختار أوراكل، خطأ، للنظر في سلسلة VARCHAR من طول صفر (سلسلة فارغة) ليكون قيمة مستحيلة، واختيار مناسب لتمثيل NULL. اتضح أن سلسلة فارغة بعيدة عن قيمة مستحيلة. انها حتى الهوية في إطار عملية من سلسلة سلسلة!

وثائق Oracle تحذر مصممي ومطوري قواعد البيانات أن بعض النسخة المقبلة من أوراكل قد كسر هذه الرابطة بين سلسلة فارغة وNULL، وكسر أي رمز التي تعتمد على هذا الارتباط.

وهناك تقنيات لبالقيم الخالية العلم غيرها من القيم مستحيلة، ولكن لم أوراكل لم تستخدمها.

و(أنا باستخدام كلمة "موقع" أعلاه ليعني تقاطع صف وعمود).

وسلسلة فارغة هي نفس NULL ببساطة لأن ه "أقل الشر" بالمقارنة مع الوضع عندما اثنين (سلسلة فارغة وباطلة) ليست هي نفسها.

في اللغات حيث NULL وسلسلة فارغة ليست هي نفسها، على المرء أن تحقق دائما كل الظروف.

وفقًا لمستندات 11g الرسمية

تتعامل قاعدة بيانات Oracle Database حاليًا مع قيمة الحرف التي يبلغ طولها صفرًا على أنها خالية.ومع ذلك، قد لا يظل هذا صحيحًا في الإصدارات المستقبلية، وتوصي Oracle بعدم التعامل مع السلاسل الفارغة مثل القيم الخالية.

أسباب محتملة

  1. val IS NOT NULL هو أكثر قابلية للقراءة من val != ''
  2. لا حاجة للتحقق من كلا الشرطين val != '' and val IS NOT NULL

مثال من كتاب

   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;

لأنه لا يتعامل مع الامر باعتباره NULL ليست مفيدة بشكل خاص، إما.

إذا قمت بخطأ ما في هذا المجال على أوراكل، وعادة ما كنت لاحظت على الفور. في خادم SQL، ومع ذلك، فإنه يبدو للعمل، ويظهر المشكلة فقط عندما يقوم شخص ما يدخل سلسلة فارغة بدلا من NULL (ربما من مكتبة العميل الصافية، حيث اغية يختلف عن ""، ولكن يمكنك عادة نعاملهم نفس ).

وأنا لا أقول أوراكل هو الحق، ولكن يبدو لي أن في كلا الاتجاهين ما يقرب من سيئة على حد سواء.

والواقع، لقد كان شيئا ولكن الصعوبات في التعامل مع أوراكل، بما في ذلك القيم التاريخ والوقت غير صالحة (لا يمكن طباعتها، وتحويلها أو أي شيء، فقط نظرت مع وظيفة DUMP ()) التي هي على السماح ل إدراجها في قاعدة البيانات، على ما يبدو من خلال بعض نسخة عربات التي تجرها الدواب من العميل كعمود ثنائي! كثيرا لحماية تكامل قاعدة البيانات!

التعامل مع أوراكل من الروابط بالقيم الفارغة:

http://digitalbush.com/2007/10/ 27 / أوراكل-9I الصفرية-السلوك /

http://jeffkemponoracle.com/2006/02/empty -string-أندور-null.html

ولم يعاملوا أولا وقبل كل شيء، سلسلة لاغية وباطلة دائما على النحو نفسه من قبل شركة أوراكل. سلسلة فارغة هو، بحكم التعريف، سلسلة تحتوي على أية أحرف. هذا ليس في كل نفس قيمة خالية. NULL هو، بحكم التعريف، وعدم وجود بيانات.

وخمس أو ست سنوات أو قبل ذلك، كان يعامل سلسلة فارغة بشكل مختلف من لاغية من قبل شركة أوراكل. في حين، مثل لاغية، وكانت سلسلة فارغة تساوي كل شيء، ومختلفة عن كل شيء (وهو ما أعتقد أنه غرامة لاغية، ولكن خاطئ تماما عن سلسلة فارغة)، على الأقل طول (سلسلة فارغة) سيعود 0، كما ينبغي منذ سلسلة فارغة هي سلسلة من طول الصفر.

وحاليا في أوراكل، طول (خالية) إرجاع لاغية والتي أعتقد هو على ما يرام، ولكن طول (سلسلة فارغة) إرجاع أيضا باطل وهو خاطئ تماما.

وأنا لا أفهم لماذا قرروا البدء في علاج هذه "القيم" متميزة 2 نفس الشيء. أنها تعني أشياء مختلفة، ويجب أن يكون مبرمج القدرة على العمل على كل بطرق مختلفة. حقيقة أنها غيرت منهجيتها يقول لي أنها حقا لم يكن لديك فكرة عن كيفية التعامل مع هذه القيم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top