Đây có thể không phải là thứ mà bạn có thể làm được trừ khi bạn muốn sử dụng CLOB thay vì VARCHAR2.
Trong Oracle, khi bạn khai báo một cột, mặc định là sử dụng ngữ nghĩa độ dài byte. Vì vậy, một VARCHAR2 (100), ví dụ, phân bổ 100 byte dung lượng lưu trữ. Nếu bạn đang sử dụng bộ ký tự một byte như ISO 8859-1, mỗi ký tự yêu cầu 1 byte bộ nhớ, do đó, điều này cũng phân bổ không gian cho 100 ký tự. Nhưng nếu bạn đang sử dụng bộ ký tự nhiều byte như UFT-8, mỗi ký tự có thể yêu cầu từ 1 đến 4 byte bộ nhớ. Do đó, tùy thuộc vào dữ liệu, VARCHAR2 (100) có thể chỉ có thể lưu trữ 25 ký tự dữ liệu (các ký tự tiếng Anh thường yêu cầu 1 byte, ký tự châu Âu thường yêu cầu 2 byte và ký tự châu Á thường yêu cầu 3 byte).
Bạn có thể yêu cầu Oracle sử dụng ngữ nghĩa độ dài ký tự, đây là cách mà tôi thường đề xuất khi chuyển từ cơ sở dữ liệu ISO-8859-1 sang cơ sở dữ liệu UTF-8. Nếu bạn khai báo một cột VARCHAR2 (100 CHAR), Oracle sẽ cấp phát không gian cho 100 ký tự bất kể cột đó là 100 byte hay 400 byte. Bạn cũng có thể đặt tham số NLS_LENGTH_SEMANTICS thành CHAR để thay đổi giá trị mặc định (đối với DDL mới) để VARCHAR2 (100) phân bổ 100 ký tự bộ nhớ thay vì 100 byte.
Tuy nhiên, thật không may cho bạn, giới hạn về kích thước của Oracle VARCHAR2 (trong ngữ cảnh của công cụ SQL chứ không phải là công cụ PL / SQL) là 4000 byte. Vì vậy, ngay cả khi bạn khai báo một cột VARCHAR2 (4000 CHAR), bạn vẫn sẽ bị giới hạn trong việc thực sự chèn 4000 byte dữ liệu có thể chỉ là 1000 ký tự. Ví dụ:trong cơ sở dữ liệu sử dụng bộ ký tự AL32UTF8, tôi có thể khai báo một cột VARCHAR2 (4000 CHAR) nhưng việc chèn một ký tự yêu cầu 2 byte bộ nhớ cho thấy rằng tôi thực sự không thể chèn 4000 ký tự dữ liệu
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
Nếu bạn cần lưu trữ 4000 ký tự của dữ liệu UTF-8, bạn cần một kiểu dữ liệu có thể xử lý 16000 byte, điều này cần phải chuyển sang CLOB.