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

Độ dài tối đa của VARCHAR là 4000 nhưng chỉ có thể lưu trữ văn bản tiếng Thái dài 2666 byte

Sự cố

Khi mô tả VARCHAR, bạn nên cung cấp một đơn vị, ví dụ:VARCHAR2(200 BYTE) hoặc VARCHAR2(200 CHAR) . Nếu bạn bỏ qua đơn vị, giá trị mặc định là BYTE (xem Khái niệm cơ sở dữ liệu Oracle, chương Kiểu dữ liệu Oracle ). Điều này có vẻ giống như một chi tiết nhỏ, nhưng trở nên khá nghiêm trọng, khi bạn có các bộ ký tự nhiều byte.

Tình huống đến 11g

Rất tiếc, có một giới hạn cứng về kích thước tối đa của cột VARCHAR2. Nó là 4000 BYTEs (!) (Xem Tham chiếu Cơ sở dữ liệu Oracle, chương Kiểu dữ liệu Oracle ) lên đến Oracle 11g và. Đây là một giới hạn khó và không có cách nào để giải quyết vấn đề này. Cách duy nhất để giải quyết vấn đề này là cột CLOB.

Giải pháp cho 12c

Tình hình khác với Oracle 12c. Ở đó, bạn có thể sử dụng tham số MAX_STRING_SIZE = EXTENDED để nâng giới hạn lên đến 32767 BYTE (xem Tham chiếu ngôn ngữ cơ sở dữ liệu Oracle, chương Loại Dữ liệu và Tham chiếu Cơ sở dữ liệu Oracle, chương Tham số khởi tạo ). Vì vậy, giải pháp rõ ràng là:Nâng cấp lên Oracle 12c, đặt MAX_STRING_SIZE = EXTENDED theo tài liệu và thay đổi định nghĩa bảng của bạn. Bạn có thể mất một số chỉ mục khi thay đổi bảng của mình, vì trước đây các chỉ mục đối với 12c not không thể chứa các giá trị VARCHAR2 với hơn 4000 BYTE và vẫn có thể có một số hạn chế. (Tôi phải kiểm tra vấn đề với các chỉ mục và nếu nó có thể được khắc phục bằng cách xây dựng lại các chỉ mục).

Giải pháp:Thay đổi mã hóa cơ sở dữ liệu

Bạn có thể thử thay đổi mã hóa cơ sở dữ liệu gốc của mình (cách cơ sở dữ liệu của bạn ánh xạ CHAR thành BYTE). Đối với điều này, bạn thường phải tạo một cơ sở dữ liệu mới và cung cấp một tham số thích hợp cho NLS_CHARACTERSET. Đây là một thay đổi rất lớn trong cách cơ sở dữ liệu của bạn hoạt động và có thể có một số tác dụng phụ. Nếu bạn cố gắng thêm các ký tự trong một bảng mã khác, bạn có thể gặp may (tức là bạn không thể lưu trữ chúng trong cơ sở dữ liệu của mình). Vì vậy, tôi sẽ không đề xuất giải pháp này.

Giải pháp:Chuyển sang CLOB

Thông thường không cần thiết phải cung cấp các truy vấn tùy ý trên các trường văn bản lớn như vậy. Bạn có thể cố gắng xác định các truy vấn đang chọn trên cột văn bản lớn và di chuyển chúng sang Văn bản Oracle trên cột CLOB. Nhưng đây là một thay đổi rất lớn và có thể không thực hiện được với lược đồ hiện có hoặc ứng dụng của bạn. Bạn có thể kết thúc với một loạt các trình kích hoạt "INSTEAD OF" và thiếu một số kiểm tra ràng buộc (liên quan đến cột CLOB mới được tạo).

Giải pháp:Sử dụng XML

Thay vì CLOB, bạn có thể cố gắng lưu trữ chuỗi của mình dưới dạng cột XML. Kích thước tối đa cho những thứ này là 4GB. Nó sẽ ảnh hưởng đến hiệu suất của bạn, bạn sẽ phải cung cấp INSTEAD OF kích hoạt và bạn có thể mất một số ràng buộc, nhưng nó có thể hiệu quả với bạn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự mơ hồ trong các phép nối bên trái (chỉ oracle?)

  2. Hiệu suất của SUBSTR trên CLOB

  3. PLS-00201:mã định danh 'R_CUR' phải được khai báo trong sql động

  4. Lỗi khi cố nhập trình điều khiển oracle jdbc7 bằng Maven

  5. XUẤT NHƯ THỐNG KÊ CHÈN:Nhưng trong SQL Plus, dòng ghi đè lên 2500 ký tự!