ฉันรู้ว่าหัวข้อนี้ขัดแย้งกันเล็กน้อยและมีบทความ / ความคิดเห็นมากมายลอยอยู่ในอินเทอร์เน็ต โชคไม่ดีที่พวกเขาส่วนใหญ่คิดว่าบุคคลนั้นไม่รู้ว่าความแตกต่างระหว่าง NULL และสตริงว่างคืออะไร ดังนั้นพวกเขาจึงบอกเล่าเรื่องราวเกี่ยวกับผลลัพธ์ที่น่าประหลาดใจด้วยการรวม / สรุปรวมและโดยทั่วไปจะทำบทเรียน SQL ขั้นสูงเพิ่มเติม โดยการทำเช่นนี้พวกเขาพลาดจุดทั้งหมดและไม่มีประโยชน์สำหรับฉัน ดังนั้นหวังว่าคำถามนี้และคำตอบทั้งหมดจะย้ายไปข้างหน้าเล็กน้อย
สมมติว่าฉันมีตารางที่มีข้อมูลส่วนบุคคล (ชื่อ, วันเกิด, ฯลฯ ) โดยที่หนึ่งในคอลัมน์คือที่อยู่อีเมลที่มีประเภท varchar เราคิดว่าด้วยเหตุผลบางคนบางคนอาจไม่ต้องการให้ที่อยู่อีเมล เมื่อแทรกข้อมูลดังกล่าว (ไม่มีอีเมล) ลงในตารางมีสองตัวเลือกที่ใช้ได้: ตั้งค่าเซลล์เป็น NULL หรือตั้งค่าเป็นสตริงว่าง ('') สมมติว่าฉันทราบถึงผลกระทบทางเทคนิคทั้งหมดของการเลือกโซลูชันหนึ่งมากกว่าโซลูชันอื่นและฉันสามารถสร้างแบบสอบถาม SQL ที่ถูกต้องสำหรับสถานการณ์ใดสถานการณ์หนึ่ง ปัญหาคือแม้เมื่อค่าทั้งสองแตกต่างกันในระดับเทคนิคพวกเขาจะเหมือนกันในระดับตรรกะ หลังจากดู NULL และ '' ฉันได้ข้อสรุปเดียว: ฉันไม่รู้ที่อยู่อีเมลของผู้ชายคนนั้น ไม่ว่าฉันจะพยายามมากแค่ไหน ฉันไม่สามารถส่งอีเมลโดยใช้ NULL หรือสตริงว่างเปล่าได้ดังนั้นเซิร์ฟเวอร์ SMTP ส่วนใหญ่ก็เห็นด้วยกับเหตุผลของฉัน ดังนั้นฉันมักจะใช้ค่า NULL ที่ฉันไม่ทราบค่าและพิจารณาสตริงว่างเปล่าเป็นสิ่งที่ไม่ดี
หลังจากการพูดคุยอย่างเข้มข้นกับเพื่อนร่วมงานฉันมาด้วยคำถามสองข้อ:
ฉันถูกสมมติว่าการใช้สตริงว่างเปล่าสำหรับค่าที่ไม่รู้จักทำให้ฐานข้อมูล "โกหก" เกี่ยวกับข้อเท็จจริงหรือไม่ เพื่อความแม่นยำมากขึ้น: การใช้ความคิดของ SQL เกี่ยวกับสิ่งที่มีค่าและสิ่งที่ไม่ฉันจะสรุป: เรามีที่อยู่อีเมลเพียงแค่ค้นหาว่ามันไม่ได้เป็นโมฆะ แต่ต่อมาเมื่อพยายามส่งอีเมลฉันจะได้ข้อสรุปที่ขัดแย้งกัน: ไม่เราไม่มีที่อยู่อีเมลที่ @! # $ ฐานข้อมูลต้องโกหก!
มีสถานการณ์เชิงตรรกะใด ๆ ที่สตริงว่าง '' อาจเป็นผู้ให้บริการที่ดีของข้อมูลสำคัญ (นอกเหนือจากค่าและไม่มีค่า) ซึ่งจะลำบาก / ไม่มีประสิทธิภาพในการจัดเก็บด้วยวิธีอื่น (เช่นคอลัมน์เพิ่มเติม) ฉันเคยเห็นโพสต์มากมายที่อ้างว่าบางครั้งมันเป็นการดีที่จะใช้สตริงว่างพร้อมกับค่าจริงและค่า NULLs แต่จนถึงขณะนี้ยังไม่เห็นสถานการณ์ที่จะเป็นตรรกะ (ในแง่ของการออกแบบ SQL / DB)
ป.ล. บางคนอาจถูกล่อลวงให้ตอบว่าเป็นเรื่องของรสนิยมส่วนตัว ฉันไม่เห็นด้วย สำหรับฉันมันคือการตัดสินใจออกแบบที่มีผลกระทบที่สำคัญ ดังนั้นฉันอยากจะเห็นคำตอบว่า opion เกี่ยวกับเรื่องนี้ได้รับการสนับสนุนด้วยเหตุผลเชิงตรรกะและ / หรือทางเทคนิค
''
แม้ใน Oracle, NULL
ไม่ได้เช่นเดียวกับ ยกตัวอย่างเช่นการกำหนดCHAR(1)
คอลัมน์ค่า''
จะส่งผล' '
(เช่นพื้นที่) NULL
ไม่ใช่ นอกจากนี้หาก Jacek ถูกใช้ Oracle คำถามนี้อาจจะไม่ได้เกิดขึ้น :-)
'' IS NULL
ประเมินเป็นtrue
PL / SQL