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

Panjang maksimal VARCHAR adalah 4000 tetapi hanya 2666 byte teks Thailand yang dapat disimpan

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle ExecuteScalar dalam pemrograman paralel terkadang mengembalikan null

  2. Merancang Skema Sederhana untuk Disagregasi Prakiraan Permintaan

  3. Perbedaan antara BYTE dan CHAR dalam tipe data kolom

  4. Bagaimana cara memanggil Prosedur Tersimpan di dalam paket Oracle dengan Entity Framework?

  5. Kursor perulangan melempar kesalahan bahwa kursor tidak ditentukan