it-swarm.asia

Kapan menggunakan NULL dan kapan menggunakan string kosong?

Saya tertarik terutama pada MySQL dan PostgreSQL, tetapi Anda dapat menjawab yang berikut secara umum:

  • Apakah ada skenario logis yang berguna untuk membedakan string kosong dari NULL?
  • Apa yang akan menjadi implikasi penyimpanan fisik untuk menyimpan string kosong sebagai ...

    • BATAL?
    • String Kosong?
    • Bidang lain?
    • Ada cara lain?
87
Maniero

Katakanlah catatan tersebut berasal dari formulir untuk mengumpulkan informasi nama dan alamat. Baris 2 dari alamat biasanya akan kosong jika pengguna tidak tinggal di apartemen. String kosong dalam kasus ini sangat valid. Saya cenderung lebih suka menggunakan NULL berarti bahwa nilainya tidak diketahui atau tidak diberikan.

Saya tidak percaya perbedaan penyimpanan fisik layak dikhawatirkan dalam praktiknya. Sebagai administrator basis data, kami memiliki ikan yang jauh lebih besar untuk digoreng!

67
Larry Coleman

Saya tidak tahu tentang MySQL dan PostgreSQL, tetapi biarkan saya memperlakukan ini secara umum.

Ada satu DBMS yaitu Oracle yang tidak memungkinkan untuk memilih pengguna antara NULL dan ''. Ini jelas menunjukkan bahwa tidak perlu membedakan keduanya. Ada beberapa konsekuensi yang menjengkelkan:

Anda menetapkan varchar2 ke string kosong seperti ini:

Update mytable set varchar_col = '';

berikut ini mengarah pada hasil yang sama

Update mytable set varchar_col = NULL;

Tetapi untuk memilih kolom di mana nilainya kosong atau NULL, Anda harus menggunakan

select * from mytable where varchar_col is NULL;

Menggunakan

select * from mytable where varchar_col = '';

secara sintaksis benar, tetapi tidak pernah mengembalikan baris.

Di sisi lain, ketika merangkai string di Oracle. NULL varchars diperlakukan sebagai string kosong.

select NULL || 'abc' from DUAL;

hasil abc. DBMS lain akan mengembalikan NULL dalam kasus ini.

Ketika Anda ingin mengekspresikan secara eksplisit, bahwa suatu nilai diberikan, Anda harus menggunakan sesuatu seperti ''.

Dan Anda harus khawatir apakah memangkas tidak menghasilkan kosong di NULL

select case when ltrim(' ') is null then 'null' else 'not null' end from dual

Itu benar.

Sekarang melihat DBMS di mana '' tidak identik dengan NULL (mis. SQL-Server)

Bekerja dengan '' umumnya lebih mudah dan dalam kebanyakan kasus tidak ada kebutuhan praktis untuk membedakan keduanya. Salah satu pengecualian yang saya tahu, adalah ketika kolom Anda mewakili beberapa pengaturan dan Anda belum mengosongkan default untuk mereka. Saat Anda dapat membedakan antara '' dan NULL, Anda dapat menyatakan bahwa pengaturan Anda kosong dan menghindari penerapan default.

26
bernd_k

Itu tergantung pada domain yang sedang Anda kerjakan. NULL berarti tidak adanya nilai (yaitu ada tidak ada nilai ), sedangkan string kosong berarti ada nilai string dengan panjang nol.

Misalnya, Anda memiliki tabel untuk menyimpan data seseorang dan itu berisi kolom Gender. Anda dapat menyimpan nilai-nilai sebagai 'Pria' atau 'Wanita'. Jika pengguna dapat memilih untuk tidak memberikan data gender, Anda harus menyimpannya sebagai NULL (yaitu pengguna tidak memberikan nilai) dan tidak string kosong (karena tidak ada gender dengan nilai '').

17
Gan

Satu hal yang perlu diingat adalah bahwa ketika Anda memiliki bidang yang tidak diperlukan, tetapi nilai apa pun yang ada harus unik akan mengharuskan Anda untuk menyimpan nilai kosong sebagai NULL. Jika tidak, Anda hanya dapat memiliki satu Tuple dengan nilai kosong di bidang itu.

Ada juga beberapa perbedaan dengan aljabar relasional dan nilai NULL: NULL! = NULL, misalnya.

10

Anda mungkin juga memperhitungkan kritik Date tentang NULL dan masalah 3VL di SQL dan Teori Relasional (dan kritik Rubinson tentang kritik Date, Nulls, Logika Berharga Tiga, dan Ambiguitas dalam SQL: Mengkritik Kritik Tanggal ).

Keduanya direferensikan dan didiskusikan panjang lebar dalam utas SO, Opsi untuk menghilangkan kolom NULLable dari model DB .

6
Abie

Sebuah pemikiran baru, pengaruh besar pada pilihan Anda NULL/NOT NULL adalah jika Anda menggunakan framework. Saya menggunakan banyak symfony dan menggunakan bidang NULL yang memungkinkan menyederhanakan beberapa kode dan pengecekan data saat memanipulasi data.

Jika Anda tidak menggunakan kerangka kerja atau jika Anda menggunakan pernyataan dan pemrosesan sql sederhana, saya akan memilih mana saja yang Anda rasa lebih mudah untuk dilacak. Saya biasanya lebih suka NULL sehingga melakukan pernyataan INSERT tidak membosankan dengan lupa mengatur bidang kosong ke NULL.

4
Patrick

Setelah harus bekerja dengan Oracle ( yang tidak memungkinkan Anda untuk membedakan ) Saya sampai pada kesimpulan berikut:

  • Dari POV logis tidak masalah. Saya benar-benar tidak bisa memikirkan contoh yang menarik di mana membedakan antara NULL dan nol-panjang-string menambahkan nilai apa pun dalam DBMS.

  • Dari yang berikut: Anda juga memiliki kolom NULLable yang tidak memungkinkan nol-len '' (Solusi Oracle-ish) atau kolom NOT NULL Yang memungkinkan nol-len.

  • Dan dari pengalaman saya, '' Membuat banyak lebih masuk akal saat memproses data, seperti biasanya Anda ingin memproses tidak adanya string sebagai string kosong: Rangkaian, Perbandingan, dll.

Catatan: Untuk kembali ke pengalaman Oracle saya: Katakan Anda ingin membuat permintaan untuk permintaan pencarian. Jika Anda menggunakan '' Anda bisa menghasilkan WHERE columnX = <searchvalue> Dan itu akan berfungsi untuk pencarian kesetaraan. Jika Anda menggunakan NULL Anda harus melakukan WHERE columnX=<searchvalue> or (columnX is NULL and serchvalue is NULL). Bah! :-)

2
Martin

Mereka juga berbeda dari perspektif desain:

misalnya.

CREATE TABLE t (
    id INTEGER  NOT NULL,
    name CHARACTER(40),
    CONSTRAINT t_PK PRIMARY KEY (id)
);

CREATE UNIQUE INDEX t_AK1 ON t (name);

Seperti:

 \d t
          Table "public.t"
 Column |     Type      | Modifiers
--------+---------------+-----------
 id     | integer       | not null
 name   | character(40) |
Indexes:
    "t_pk" PRIMARY KEY, btree (id)
    "t_ak1" UNIQUE, btree (name)

Mari kita memasukkan beberapa data:

op=# insert into t(id, name ) values ( 1, 'Hello');
INSERT 0 1

op=# insert into t( id, name) values ( 2, '');
INSERT 0 1

op=# insert into t( id, name) values ( 3, '');

ERROR:  duplicate key value violates unique constraint "t_ak1"

Sekarang mari kita coba dengan nol:

op=# insert into t( id, name) values (4, null );

INSERT 0 1

op=# insert into t( id, name) values (5, null);

INSERT 0 1

Ini dibolehkan.

Soooooo: null bukan string sepele atau sebaliknya.

Bersulang

2
Guy Birkbeck

Jika kita berbicara tentang teori, maka aturan Codd mengatakan bahwa RDBMS harus memperlakukan nilai NULL dengan cara khusus.

Bagaimana tepatnya yang digunakan tergantung pada arsitek basis data, tergantung pada domain aktual - tugas - proyek - aplikasi - area.

1
noonex