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

Semantik CHAR dan ORA-01461

Ini mungkin bukan sesuatu yang dapat Anda atasi kecuali Anda ingin menggunakan CLOB daripada VARCHAR2.

Di Oracle, saat Anda mendeklarasikan kolom, defaultnya adalah menggunakan semantik byte-length. Jadi VARCHAR2(100), misalnya, mengalokasikan 100 byte penyimpanan. Jika Anda menggunakan kumpulan karakter byte tunggal seperti ISO 8859-1, setiap karakter memerlukan penyimpanan 1 byte, jadi ini juga mengalokasikan ruang untuk 100 karakter. Tetapi jika Anda menggunakan kumpulan karakter multi-byte seperti UFT-8, setiap karakter dapat memerlukan penyimpanan antara 1 dan 4 byte. Bergantung pada data, oleh karena itu, VARCHAR2(100) mungkin hanya dapat menyimpan 25 karakter data (karakter bahasa Inggris umumnya memerlukan 1 byte, karakter Eropa umumnya memerlukan 2 byte, dan karakter Asia umumnya memerlukan 3 byte).

Anda dapat memberi tahu Oracle untuk menggunakan semantik panjang karakter yang biasanya saya sarankan ketika berpindah dari database ISO-8859-1 ke database UTF-8. Jika Anda mendeklarasikan kolom VARCHAR2(100 CHAR), Oracle akan mengalokasikan ruang untuk 100 karakter terlepas dari apakah itu akhirnya menjadi 100 byte atau 400 byte. Anda juga dapat menyetel parameter NLS_LENGTH_SEMANTICS ke CHAR untuk mengubah default (untuk DDL baru) sehingga VARCHAR2(100) mengalokasikan 100 karakter penyimpanan daripada 100 byte.

Sayangnya untuk Anda, batas ukuran Oracle VARCHAR2 (dalam konteks mesin SQL daripada mesin PL/SQL) adalah 4000 byte. Jadi, bahkan jika Anda mendeklarasikan kolom VARCHAR2(4000 CHAR), Anda masih akan dibatasi untuk benar-benar memasukkan 4000 byte data yang mungkin sedikitnya 1000 karakter. Misalnya, dalam database menggunakan set karakter AL32UTF8, saya dapat mendeklarasikan kolom VARCHAR2(4000 CHAR) tetapi memasukkan karakter yang membutuhkan penyimpanan 2 byte menunjukkan bahwa saya tidak dapat benar-benar memasukkan 4000 karakter data

SQL> create table foo (
  2    col1 varchar2(4000 char)
  3  );

Table created.

SQL> insert into foo values( rpad( 'abcde', 4000, unistr('\00f6') ) );

1 row created.

SQL> ed
Wrote file afiedt.buf

  1* insert into foo values( rpad( 'abcde', 6000, unistr('\00f6') ) )
SQL> /

1 row created.

SQL> select length(col1), lengthb(col1)
  2    from foo;

LENGTH(COL1) LENGTHB(COL1)
------------ -------------
        2003          4000
        2003          4000

Jika Anda perlu menyimpan 4000 karakter data UTF-8, Anda memerlukan tipe data yang dapat menangani 16000 byte yang mengharuskan pemindahan ke CLOB.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengembalikan resultet/kursor dari blok anonim Oracle PL/SQL yang menjalankan SQL Dinamis?

  2. Kesalahan java.sql.SQLException:ORA-00911:karakter tidak valid

  3. Mengapa saya menerima nilai yang tidak cukup saat menjalankan INSERT?

  4. Sql - alternatif dari WITH ... AS

  5. Oracle/SQL - Pilih rentang tertentu dari catatan berurutan