মাইএসকিউএল, নুল বা খালি স্ট্রিং toোকানো ভাল?


230

আমার একটি ওয়েবসাইটে একটি ফর্ম রয়েছে যার বিভিন্ন ক্ষেত্র প্রচুর। কিছু ক্ষেত্র alচ্ছিক এবং কিছু বাধ্যতামূলক। আমার ডিবিতে আমার কাছে একটি টেবিল রয়েছে যা এই সমস্ত মানগুলিকে ধারণ করে, ডিবি কলামগুলিতে কোনও নুল মান বা একটি খালি স্ট্রিং toোকানো ভাল অনুশীলন যেখানে ব্যবহারকারী কোনও ডেটা রাখেনি?

উত্তর:


220

ব্যবহার করে NULLআপনি "কোনও তথ্য রাখবেন না" এবং "খালি ডেটা রাখুন" এর মধ্যে পার্থক্য করতে পারবেন।

আরও কিছু পার্থক্য:

  • একজন LENGTHএর NULLহয় NULL, একটি LENGTHএকটি খালি স্ট্রিং হয় 0

  • NULLগুলি খালি স্ট্রিংয়ের আগে বাছাই করা হয়।

  • COUNT(message)খালি স্ট্রিংগুলি গণনা করবে তবে NULLগুলি নয়

  • আপনি বাউন্ড ভেরিয়েবল ব্যবহার করে একটি খালি স্ট্রিং সন্ধান করতে পারেন তবে এটির জন্য নয় NULL। এই ক্যোয়ারী:

    SELECT  *
    FROM    mytable 
    WHERE   mytext = ?
    

    একটি সাথে মিলবে না NULLmytextযাই হোক না কেন মান আপনি ক্লায়েন্ট থেকে পাস। এর সাথে মেলে NULL, আপনাকে অন্যান্য ক্যোয়ারী ব্যবহার করতে হবে:

    SELECT  *
    FROM    mytable 
    WHERE   mytext IS NULL
    

3
তবে আপনি কোনটি দ্রুত বলে মনে করেন? 0 বা NULL বা ""
অতুল দ্রাবিড়

8
ইনোডিবিতে নুলের কম জায়গা নেওয়া
টিমো হুভিনেন

37
আমি মনে করি এটি একটি ঠিক উত্তর, তবে এটি প্রশ্নের "সেরা অনুশীলন" উপাদানটিকে পুরোপুরি উপেক্ষা করে এবং কেবলমাত্র স্পর্শকাতরভাবে প্রাসঙ্গিক তথ্যগুলিতে মনোনিবেশ করে (NULL সাজানোর ক্রম এবং দৈর্ঘ্য? এগুলি কোনও ব্যাপার নয়)। সবচেয়ে টেক্সট তথ্য ইনপুট ধরনের সেখানে নয় তাই আমি মনে করি এই একটি মহান প্রশ্ন করে একটি ভাল উত্তর দাবী, "কোন প্রতিক্রিয়া" এবং "খালি প্রতিক্রিয়া" মধ্যে একটি পার্থক্য।
নিক

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

1
@ কাসনোই দুঃখিত, আমি বোঝাতে চাইছি, ড্রাইভিং নম্বর লাইসেন্সকে অনন্য হিসাবে সেট করা খারাপ অভ্যাস কেন ...?
সিডবেউ

44

একটি বিষয় বিবেচনা করতে হবে, আপনি যদি কখনও ডেটাবেস স্যুইচ করার পরিকল্পনা করেন তবে তা হ'ল ওরাকল খালি স্ট্রিং সমর্থন করে না । এগুলি স্বয়ংক্রিয়ভাবে নূলে রূপান্তরিত হয় এবং আপনি তাদের মতো লেজ ব্যবহার করে জিজ্ঞাসা করতে পারবেন না WHERE somefield = ''


11
এটি আপনার লিংকেও আমার কাছে অবিশ্বাস্যরূপে মজাদার মনে হয়েছিল, তাই আমি এটি চেষ্টা করেছিলাম। নাল ক্ষেত্র, '' এ সেট করা, ওরাকল এটিকে উপেক্ষা করে। দৈর্ঘ্য 0 এর চেয়ে নাল হিসাবে প্রতিবেদন করে That's এটা ঠিক এত ভুল। এই কাছাকাছি কিছু উপায় আছে। ভাবুন আমি এটিকে অন্য প্রশ্ন হিসাবে পোস্ট করব।
স্টিভ বি।

1
Steve B.: এই প্রশ্ন দেখতে পাবেন stackoverflow.com/questions/1171196/...
Quassnoi

রেফারেন্সের জন্য ধন্যবাদ, যদিও আমি এখনও যুক্তি বুঝতে পারি না। স্ট্যাকওভারফ্লো
স্টিভ বি

কোসনোই পোস্ট করেছেন লিংক থেকে তথ্য অন্তর্ভুক্ত করার জন্য উত্তরটি আপডেট করার উপযুক্ত হতে পারে
স্যামুয়েলকেডিভিস

7
পিপলসফট (ওরাকল ডিবি সহ) একটি শূন্য মান নির্দেশ করতে একটি স্থান ব্যবহার করে। অবিশ্বাস্যভাবে বোকা। 0 টি অনুমোদিত নয় বলে এফটিইয়ের জন্য 0 টি নির্দেশ করতে তারা 0.00025 ব্যবহার করে। সেই পণ্যটিতে দুর্দান্ত পছন্দগুলি করা হয়েছিল।
জেপি ডাফি

9

একটি জিনিস মনে রাখবেন যে NULL আপনার কোডপথগুলিকে আরও বেশি জটিল করে তুলতে পারে। পাইথন উদাহরণ সবচেয়ে ডাটাবেসের অ্যাডাপটর / ORMs মানচিত্র NULLথেকে None

সুতরাং বিষয়গুলি:

print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow

"হ্যালো, কেউ জো ডো নেই!" এর ফলস্বরূপ! এড়াতে আপনার এই কোডের মতো কিছু দরকার:

if databaserow.title:
    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
    print "Hello, %(firstname) %(lastname)!" % databaserow

যা জিনিসকে আরও জটিল করে তুলতে পারে।


25
আমার মতে আপনার কোড বা ফ্রেমওয়ার্কের ত্রুটিগুলি "ফিক্স" করতে আপনার ডাটাবেসটিকে অপব্যবহার করা একটি (খুব) খারাপ কোডিং অনুশীলন। যখন কোনও ডেটা নেই তখন আপনার কেবল ন্যূনাল inোকানো উচিত এবং এটি ব্যবহারে সামঞ্জস্য থাকা উচিত। অন্যথায় আপনাকে অবশ্যই বিবৃতিগুলি ব্যবহার করতে হবে: যদি (মাইস্ট্রিং == নাল || মাইস্ট্রিং = "")। যখন কোনও কোড আপনার কোডে সেট বা সংজ্ঞায়িত করা হয় না তখন আপনি কোনও ধরণের "স্থানধারক" এর পরিবর্তে NULL ব্যবহার করছেন (যা একটি খালি স্ট্রিং আমার মতে)।
জার্মটজান

5
আপনার পছন্দের ভাষার উপর নির্ভর করে। পাইথনে "যদি মাই স্ট্রিং না হয়:" কোনওটি নয় এবং "" এর জন্য পরীক্ষা। সম্ভবত প্রধানত একটি সাংস্কৃতিক সমস্যা। জাভা গাইস "খারাপ অনুশীলন" হ'ল গতিশীল ব্যক্তির কমনীয়তা।
সর্বাধিক

9

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

সীমাবদ্ধতায় খালি স্ট্রিং নিয়ে আপনার সমস্যা থাকবে । কোনও বিদেশী কী সীমাবদ্ধতা মেটানোর জন্য আপনাকে একটি অনন্য ফাঁকা স্ট্রিং সহ একটি জাল রেকর্ড sertোকাতে হতে পারে। খারাপ অনুশীলন আমার ধারণা।

আরও দেখুন: একটি বিদেশী কী কী নল এবং / বা সদৃশ হতে পারে?


সীমাবদ্ধতার ইস্যুটি অতীতে আমাকে ছিন্ন করেছে তাই সে কারণেই আমি এই উত্তরটি "+1" করি।
এইচপিডাব্লুডি

তবে আপনি যদি নুল ব্যবহার করেন তবে খুব নিশ্চিত হয়ে নিন যে আপনার কোনও খালি স্ট্রিংও শেষ হবে না। অনেকগুলি ইউআই প্রযুক্তির সাথে করা সহজ।
টুনটেবল

5

আমি জানি না এখানে সর্বোত্তম অনুশীলনটি কী হবে তবে আমি সাধারণত শূন্যের পক্ষে ভুল করব যদি না আপনি শূন্য-স্ট্রিংয়ের চেয়ে আলাদা কিছু বোঝাতে চান এবং ব্যবহারকারীর ইনপুটটি আপনার খালি স্ট্রিং সংজ্ঞাটির সাথে মেলে না।

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

ওহ, এবং মনে রাখবেন যে কলামটি যদি নাল হয় তবে রেকর্ডটি কার্যতভাবে এমন কোনও প্রশ্নের মধ্যে উপস্থিত হওয়ার সম্ভাবনা কম (যেটি কলামটি ছাড়াই নির্বাচিত হয়েছে (যেখানে একটি ধারা আছে, এসকিউএল পদে রয়েছে), যদি না নির্বাচনটি নাল কলামের জন্য থাকে অবশ্যই.


1
... এবং এখন যেহেতু আমি আমার উপরে উত্তরটি দেখতে পাচ্ছি, আমি মনে করি এটি নিরাপদ বলে মনে হয় যে আপনি যে সাধারণ পার্থক্যটি যত্ন নেবেন তা খালি ডেটা বনাম কোনও ডেটা নয়। :-)
প্লাটিনাম আউজুর

1

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

একটি অনন্য সূচক মধ্যে কলম্বস:
(ইভেন্ট_ টাইপ_আইডি, ইভেন্ট_ শিরোনাম, তারিখ, অবস্থান, ইউআরএল)

উদাহরণ 1:
(1, 'বিবিকিউ', '2018-07-27', নাল, নাল)
(1, 'বিবিকিউ', '2018-07-27', নাল, নাল) // অনুমোদিত এবং সদৃশ।

উদাহরণ 2:
(1, 'বিবিকিউ', '2018-07-27', '', '')
(1, 'বিবিকিউ', '2018-07-27', '', '') // এটি নকল হিসাবে অনুমোদিত নয়।

এখানে কিছু কোড রয়েছে:

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `event_id` int(11) DEFAULT NULL,
  `event_title` varchar(50) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `location` varchar(50) DEFAULT NULL,
  `url` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

এখন এটি সন্নিবেশ করুন এটি অনুলিপিযুক্ত সারিগুলির অনুমতি দেবে:

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);

এখন এটি sertোকান এবং পরীক্ষা করুন যে এটি অনুমোদিত নয়:

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');

সুতরাং, এখানে কোনও সঠিক বা ভুল নেই। আপনার ব্যবসায়ের বিধিগুলির সাথে কোনটি সবচেয়ে ভাল কাজ করে তা সিদ্ধান্ত নেওয়ার বিষয় আপনি।

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