Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Ngữ nghĩa CHAR và ORA-01461

Đâ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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm FROM_TZ () trong Oracle

  2. Cách xem những đặc quyền nào được cấp cho giản đồ của người dùng khác

  3. Liferay:Không tìm thấy trình điều khiển phù hợp

  4. ORACLE SQL chọn riêng biệt không xóa các bản sao

  5. Oracle sqlldr:cột không được phép ở đây