Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Apa perbedaan utama antara Varchar2 dan char

Meskipun sudah ada beberapa jawaban yang menggambarkan dengan benar perilaku char , saya rasa perlu dikatakan bahwa Anda tidak boleh menggunakannya kecuali dalam tiga situasi khusus:

  1. Anda sedang membuat file atau laporan dengan panjang tetap, dan menetapkan nilai non-null ke char menghindari kebutuhan untuk membuat kode rpad() ekspresi. Misalnya, jika firstname dan lastname keduanya didefinisikan sebagai char(20) , lalu firstname || lastname adalah cara yang lebih pendek untuk menulis rpad(firstname,20) || rpad(lastname,20) untuk membuat Chuck Norris .
  2. Anda perlu membedakan antara string kosong eksplisit '' dan null . Biasanya mereka adalah hal yang sama di Oracle, tetapi menetapkan '' ke char value akan memicu perilaku blank-padding saat null tidak akan, jadi jika penting untuk membedakannya, dan saya tidak dapat benar-benar memikirkan alasan mengapa hal itu terjadi, maka Anda memiliki cara untuk melakukannya.
  3. Kode Anda di-porting dari (atau harus kompatibel dengan) beberapa sistem lain yang memerlukan bantalan kosong karena alasan lama. Dalam hal ini Anda terjebak dengan itu dan Anda memiliki simpati saya.

Benar-benar tidak ada alasan untuk menggunakan char hanya karena beberapa panjangnya diperbaiki (mis. Y/N bendera atau kode mata uang ISO seperti 'USD' ). Ini tidak lebih efisien, tidak menghemat ruang (tidak ada indikator panjang mitos untuk varchar2 , hanya ada overhead padding kosong untuk char ), dan itu tidak menghentikan siapa pun yang memasukkan nilai yang lebih pendek. (Jika Anda memasukkan 'ZZ' di char(3) . Anda kolom mata uang, itu hanya akan disimpan sebagai 'ZZ ' .) Ini bahkan tidak kompatibel dengan beberapa versi Oracle kuno yang pernah mengandalkannya, karena tidak pernah ada.

Dan penularan dapat menyebar, karena (mengikuti praktik terbaik) Anda mungkin mengaitkan deklarasi variabel menggunakan sesuatu seperti sales.currency%type . Sekarang l_sale_currency your Anda variabel adalah char sembunyi-sembunyi yang akan menjadi kosong tanpa terlihat untuk nilai yang lebih pendek (atau '' ), membuka pintu untuk mengaburkan bug di mana l_sale_currency tidak sama dengan l_refund_currency meskipun Anda menetapkan 'ZZ' untuk keduanya.

Beberapa berpendapat bahwa char(n) (di mana n adalah beberapa karakter panjang) menunjukkan bahwa nilai diharapkan menjadi n karakter panjang, dan ini adalah bentuk dokumentasi diri. Tapi tentunya jika Anda serius tentang format 3 karakter (kode negara ISO-Alpha-3 daripada ISO-Alpha-2, misalnya), tidakkah Anda akan menentukan batasan untuk menegakkan aturan, daripada membiarkan pengembang melirik sebuah char(3) tipe data dan menarik kesimpulan mereka sendiri?

CHAR diperkenalkan di Oracle 6 untuk, saya yakin, alasan kompatibilitas ANSI. Mungkin ada pelanggan potensial yang memutuskan produk database mana yang akan dibeli dan kompatibilitas ANSI ada di daftar periksa mereka (atau dulunya saat itu), dan CHAR dengan blank-padding didefinisikan dalam standar ANSI, jadi Oracle perlu menyediakannya. Anda tidak seharusnya menggunakannya.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ORA-01460:permintaan konversi yang tidak diterapkan atau tidak masuk akal

  2. Mendapatkan output dari dbms_output.get_lines menggunakan JDBC

  3. MONTHS_BETWEEN() Fungsi di Oracle

  4. Memformat String UUID tanpa REGEXP_REPLACE dan PL/SQL

  5. Tidak ada lagi SPU