Masalahnya
Saat menjelaskan VARCHAR, Anda harus menyediakan unit, mis. VARCHAR2(200 BYTE)
atau VARCHAR2(200 CHAR)
. Jika Anda menghilangkan unit, defaultnya adalah BYTE
(lihat Konsep Database Oracle, bab Tipe Data Oracle ). Ini tampaknya seperti detail kecil, tetapi menjadi sangat parah, ketika Anda memiliki set karakter multi-byte.
Situasi hingga 11g
Sayangnya ada batasan keras pada ukuran maksimum kolom VARCHAR2. Ini adalah 4000 BYTE (!) (lihat Referensi Database Oracle, bab Tipe Data Oracle ) hingga Oracle 11g dan . Ini adalah batas yang sulit dan tidak ada jalan lain untuk itu. Satu-satunya cara untuk mengatasi ini adalah kolom CLOB.
Solusi untuk 12c
Situasinya berbeda pada Oracle 12c. Di sana Anda dapat menggunakan parameter MAX_STRING_SIZE = EXTENDED
untuk menaikkan batas hingga 32767 BYTE (lihat Referensi Bahasa Database Oracle, bab Tipe Data
dan Referensi Database Oracle, bab Parameter Inisialisasi ). Jadi solusi yang jelas adalah:Tingkatkan ke Oracle 12c, setel MAX_STRING_SIZE = EXTENDED
sesuai dengan dokumentasi
dan ubah definisi tabel Anda. Anda mungkin kehilangan beberapa indeks saat mengubah tabel Anda, karena sebelumnya ke 12c tidak indeks tidak dapat menampung nilai VARCHAR2 dengan lebih dari 4000 BYTE dan mungkin masih ada beberapa batasan. (Saya harus memeriksa masalah dengan indeks dan apakah itu dapat diperbaiki dengan membangun kembali indeks).
Solusi:Ubah penyandian basis data
Anda dapat mencoba mengubah penyandian basis data asli Anda (cara basis data Anda memetakan CHAR ke BYTE). Untuk ini, Anda biasanya harus membuat database baru dan menyediakan parameter yang sesuai untuk NLS_CHARACTERSET. Ini adalah perubahan yang sangat besar dalam cara database Anda beroperasi dan mungkin memiliki beberapa efek samping. Jika Anda pernah mencoba menambahkan karakter dalam penyandian yang berbeda, Anda mungkin kurang beruntung (mis. Anda tidak dapat menyimpannya di database Anda). Jadi saya tidak akan menyarankan solusi ini.
Solusi:Beralih ke CLOB
Biasanya tidak perlu memberikan kueri sewenang-wenang pada bidang teks besar seperti itu. Anda dapat mencoba mengidentifikasi kueri yang dipilih pada kolom teks besar dan memigrasikannya ke Teks Oracle pada kolom CLOB. Tetapi ini adalah perubahan yang sangat besar dan mungkin tidak dapat dilakukan dengan skema atau aplikasi Anda yang ada. Anda mungkin berakhir dengan sekelompok pemicu "BUKAN" dan dengan beberapa pemeriksaan kendala yang hilang (melibatkan kolom CLOB yang baru dibuat).
Solusi:Gunakan XML
Alih-alih CLOB, Anda dapat mencoba menyimpan string Anda sebagai kolom XML. Ukuran maksimum untuk ini adalah 4GB. Ini akan merusak kinerja Anda, Anda harus menyediakan BUKAN pemicu dan Anda mungkin kehilangan beberapa kendala, tetapi itu bisa berhasil untuk Anda.