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:
- Anda sedang membuat file atau laporan dengan panjang tetap, dan menetapkan nilai non-null ke
char
menghindari kebutuhan untuk membuat koderpad()
ekspresi. Misalnya, jikafirstname
danlastname
keduanya didefinisikan sebagaichar(20)
, lalufirstname || lastname
adalah cara yang lebih pendek untuk menulisrpad(firstname,20) || rpad(lastname,20)
untuk membuatChuck Norris
. - Anda perlu membedakan antara string kosong eksplisit
''
dannull
. Biasanya mereka adalah hal yang sama di Oracle, tetapi menetapkan''
kechar
value akan memicu perilaku blank-padding saatnull
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. - 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.