নুলের একটি উপাধি অনেক ডাটাবেসে কীভাবে সমস্যা সৃষ্টি করে?


71

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

তারা যে ত্রুটির মুখোমুখি হচ্ছে সে সম্পর্কে কোনও ব্যাখ্যা দেওয়া হয়নি।

তবে আমি যতদূর জানি স্ট্রিং 'নুল' এবং আসল নাল মানটি সম্পূর্ণ আলাদা (একটি ডাটাবেসের দৃষ্টিকোণ থেকে)।

কেন এটি একটি ডাটাবেসে সমস্যার সৃষ্টি করবে?


2
এটি বিবিসির একটি নিবন্ধে উদ্ধৃত লোকেদের দ্বারা লেখা নামগুলি সম্পর্কে প্রোগ্রামাররা অনুমানগুলি সম্পর্কে কিছুটা বিখ্যাত ব্লগ নিবন্ধ: kalzumeus.com/2010/06/17/…
ডব্লু



4
আমি এই লোকটিকে প্রথমবার টিভিতে দেখেছি ধরে নিয়েছিলাম এটি একটি ডাটাবেস বাগ। তখন আমি জানতে পারি এটি আসলে তার নাম।
নেট এল্ড্রেজ

3
@ জারোডরোবারসন "জেনিফার নুল" এবং ওপি পোস্ট করা লিঙ্কটির মতো-নামক সমস্যাগুলির বিবরণ দিয়ে আপনি কীভাবে "পুরো অনুমানটি মিথ্যা" বলতে পারেন? এটি আসল সমস্যা যা আসল ব্যবহারকারীদের মুখোমুখি।
স্টিভেন বার্নাপ

উত্তর:


102

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

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


30
তবে এই ক্ষেত্রে, আপনি যদি নিবন্ধটি প্রশ্নে পড়ে থাকেন তবে একটি শেষ নাম ক্ষেত্র NOT NULLতৈরি করা অন্যান্য লোকদের জন্য পুরো সমস্যা তৈরি করবে। "কিছু ব্যক্তির কেবলমাত্র একটি নাম থাকে, নাম এবং উপাধি নেই" "
মাইক দ্য লাইয়ার

41
@ দারখোগ এই সম্পর্কে প্রচুর লোকেরা আমার সাথে দ্বিমত পোষণ করেন তবে আমি মনে করি নামগুলি ইমেল ঠিকানার মতো - সেগুলি যাচাই করতে বিরক্ত করবেন না, ব্যবহারকারীর একটি একক পাঠ্য বাক্স দিন এবং তাদের যা চান তা রাখতে দিন। এটি এমন তথ্য যা আমার যদি সত্যই প্রয়োজন হয় তবে আমি এটি আপনার কাছ থেকে এমনভাবে পাব যা নিশ্চিত হওয়া নিশ্চিত।
মাইক দ্য লাইয়ার

8
@mikeTheLiar আমি এর জন্য নামটি জানি না তবে ত্রুটিগুলির একটি সম্পূর্ণ শ্রেণি রয়েছে যা ডেটাতে অত্যধিক নিয়ন্ত্রণমূলক নিয়ম তৈরির ফলে আসে। প্রায়শই আপনি অ্যাপ্লিকেশন এবং ডেটাবেজে সংখ্যা হিসাবে সংজ্ঞায়িত ডাক কোড এবং টেলিফোন নম্বর দেখতে পাবেন। এগুলি আসলে সংখ্যা নয় কারণ তাদের গাণিতিক ক্রিয়াকলাপগুলি করার কোনও অর্থ হয় না। সুতরাং কেউ যখন কানাডার ঠিকানা প্রবেশ করার চেষ্টা করে তখন তারা আটকে থাকে।
জিমি জেমস

19
@ জিমি জেমস হ্যাঁ, জিপ কোডগুলি সংখ্যাসূচক হিসাবে সংরক্ষণ করা হয়েছে এবং হঠাৎ এখানে যে কেউ বাস করছেন তার একটি বেস -8 জিপ কোড রয়েছে। "আপনি যদি এটির সাথে গণিত না করে থাকেন তবে এটি একটি স্ট্রিং, ফুল স্টপ।"
মাইক দ্য লাইয়ার

8
@mikeTheLiar। একটি একক স্ট্রিং হিসাবে নাম চিকিত্সা সঙ্গে সমস্যা (সাধারণত ভাল, আমি সম্মত) আপনি যখন আর্নাম দ্বারা বর্ণানুক্রমিক বাছাইয়ের প্রয়োজন আছে।
ট্রিগ

13

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

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


এটি নিরাপদ স্ট্রিং অন্তরঙ্গকরণের কারণে ঘটেছে যা এসকিউএল ইঞ্জেকশনের দিকে নিয়ে যেতে পারে তা কল্পনা করা শক্ত hard আপনি একটি SQL কোয়েরি মধ্যে ব্যবহারকারীর ইনপুট উদ্ধৃত করা ভুলে যান তাহলে (যেমন INSERT INTO users (first, last) VALUES($first, $last)মূল্যায়ণ করতে INSERT INTO users (first, last) VALUES(Jennifer, Null)) সবাই যাদের নাম না বৈধ এসকিউএল কীওয়ার্ড বা কলাম নামে মাত্র যাচ্ছি ত্রুটি নিক্ষেপ করা এবং তাদের রেকর্ড পারেন ঢোকানো নেই। কারণটি আরও জটিল হতে হবে।
অ্যান্ড্রু মেডিকো

আপনার স্ট্র ম্যানের @ অ্যান্ড্রুমেডিকো উদাহরণ হ্যাঁ তবে কিছু ভুল করার উপায় রয়েছে। <স্ট্রাইক> মূর্খতা <\ ধর্মঘট> অজ্ঞতার শক্তিটিকে কখনই হ্রাস করবেন না। মূল কথাটি হ'ল আসল সমস্যাটি কী তা আমাদের কোনও ধারণা নেই কারণ আমরা প্রশ্নে থাকা কোডটি পর্যালোচনা করতে পারি না
এরিক

7

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


2

সম্ভবত এটি একটি প্রোগ্রামিং সমস্যা। আপনি যদি এই জবাবটি এখানে দেখেন যে কীভাবে NULL পাস হচ্ছে আপনি সহজেই কিছুটা অনাকাঙ্ক্ষিত আচরণের কারণ হতে পারেন যদি আপনি "মিঃ নুল" হন।

https://stackoverflow.com/questions/4620391/mysql-and-php-insert-null-rather-than-empty-string

আপনি দেখতে পাচ্ছেন যে যদি কিছু ডেটা উপাদান NULL হিসাবে পাস করা হয় তবে ডেটাবেসটিতে ডেটাবেস নাল হিসাবে ডেভেলপ করা হবে।

"নুল"! = ডাটাবেস নাল

কিছু কিছু ক্ষেত্রে এবং সম্পর্কিত আচরণ ব্যবহার করে ...

ধরা যাক যে ডাটাবেসটিতে শেষ নামটি শূন্য নয় হিসাবে চিহ্নিত করা হয়েছিল, এখন যখন তথ্য isোকানো হবে তখন এটি একটি NULL হিসাবে ব্যাখ্যা করা হবে এবং সন্নিবেশটি ব্যর্থ হবে।

আরেকটি কেস বলা যাক যে শেষ নামটি ডাটাবেসটিতে naclable ছিল। মিঃ NULL inোকানো হয়েছে এবং DBNull.Value তে রূপান্তরিত হবে যা "NULL" এর মতো নয়। সন্নিবেশের পরে মিঃ নুলকে আমরা খুঁজে পাই না কারণ তার শেষ নাম "নুল" নয় তবে বাস্তবে একটি ডাটাবেস নাল মান।

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


"আপনি দেখতে পাচ্ছেন যে যদি কোনও ডেটা উপাদান NULL হিসাবে পাস করা হয় তবে ডেটাবেসটিতে ডেটাবেস নাল হিসাবে ডেভেলপ করা হত" " - লিঙ্কযুক্ত এসও প্রশ্ন / স্বীকৃত-উত্তর এটি প্রদর্শিত হবে না?
মিঃ হোয়েট

2

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

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


আপনি এসকিউএল ব্যবহার করে অ্যাপ্লিকেশনগুলির দুর্বল বাস্তবায়ন বোঝাতে চাইছেন ? কোনও আরডিবিএমএসের কোনও গুরুতর প্রয়োগ নিজেই এর পক্ষে ঝুঁকিপূর্ণ হবে না (যেমন কোনও গুরুতর প্রয়োগ নেই!)
আন্ডারস্কোর_

0

মৌলিকভাবে একটি সমস্যা হ'ল "নাল" শব্দটি দুটি পৃথক ডাটাবেস ধারণা প্রয়োগ করা হয়, কখনও কখনও তাদের মধ্যে পার্থক্য করার জন্য প্রসঙ্গ ব্যবহার করে:

  1. কোনও কিছুর জ্ঞাত মান নেই
  2. কোন কিছুর কোনও মূল্য নেই বলে জানা যায়

যদিও প্রসঙ্গে কখনও কখনও এই ধারণাগুলির মধ্যে পার্থক্য করার জন্য পর্যাপ্ত পরিমাণে থাকতে পারে, এমন অনেক সময় আছে যখন এটি সত্যই হয় না। যদি কেউ অনুসন্ধান অনুসন্ধানের জন্য কোনও রেকর্ড ব্যবহার করে থাকে, উদাহরণস্বরূপ, "আমি [যা কিছু] নামে কোনও ব্যক্তির নাম চাইছি, কোনও শেষ নাম নেই" বলার মধ্যে পার্থক্য থাকা উচিত, বনাম "আমি এমন কাউকে চাই যার প্রথম নাম [ যাই হোক না কেন] তবে যার শেষ নামটি অজানা। " অনেক ডাটাবেস ইঞ্জিনগুলির একটির অর্থ বা অন্যটির প্রতি পক্ষপাত রয়েছে তবে সেগুলি সব একই নয়। কোনও ডাটাবেস ইঞ্জিনটি এক উপায়ে কাজ করার প্রত্যাশা করে এমন কোডটি অন্য কোনও ইঞ্জিনে চালিত হয়েছে যা অন্যভাবে চালিত হয় ma


যদি কোনও স্ট্রিংয়ের কোনও মান না থাকে বলে জানা যায়, তবে মানটি শূন্য স্ট্রিং হওয়া উচিত, নাল স্ট্রিং নয়।
বায়রন জোন্স

0

বিদ্যমান উত্তরগুলির বেশিরভাগটিতে একটি অ্যাপ্লিকেশনের নন- এসকিউএল অংশগুলিতে মনোনিবেশ করা হয় তবে এসকিউএল-তেও সমস্যা হতে পারে:

যদি কোনও ব্যবহারকারীর শেষ নাম উপলব্ধ না হয় এমন রেকর্ডগুলি ফিল্টার আউট করার নির্দেশ দেওয়া হয় তবে যে কেউ এসকিউএল খুব ভাল বুঝতে পারে না সে ফিল্টার লিখতে পারে WHERE u.lastname != 'NULL'। এসকিউএল যেভাবে কাজ করে তার কারণেই এটি প্রদর্শিত হবে u.lastname IS NOT NULL: সমস্ত NULLরেকর্ড ফিল্টার হয়ে যায় কিনা । সমস্ত অ NULLরেকর্ড রয়ে গেছে।

রেকর্ডের জন্য কোর্স ব্যতীত যেখানে u.lastname == 'NULL', তবে পরীক্ষার সময় এমন কোনও রেকর্ড পাওয়া যায় না।

এই যদি এসকিউএল ফ্রেমওয়ার্ক, যেখানে যে ফ্রেমওয়ার্ক অ- জন্য চেক করতে একটি সহজে প্রবেশযোগ্য উপায় দেখাবে না তা কিছু বাছাই দ্বারা উৎপন্ন হয় সম্ভাবনা বেশি হয়ে NULLপরামিতি সঙ্গে -ness, এবং কেউ লক্ষ্য করছেন "আরে, আমি যদি স্ট্রিং পাস NULL, এটা আমি যা চাই ঠিক তাই করে! "

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