Trừ khi bạn chỉ quan tâm đến sự thay đổi tối đa, ví dụ của bạn không đúng.
AL32UTF8 là một bộ ký tự có độ dài thay đổi. Nói một cách tổng quát, bất kỳ ký tự nào trong bộ ký tự US7ASCII sẽ chiếm 1 byte, các ký tự châu Âu thường yêu cầu 2 byte, các ký tự ngôn ngữ châu Á khác nhau yêu cầu 3 byte và một số ký tự rất hiếm sẽ yêu cầu 4 byte. Thực tế, nếu bạn đang nói về việc chuyển đổi dữ liệu WE8ISO8859P1 thực tế thành AL32UTF8, bạn sẽ thấy trên thực tế hệ số chuyển đổi giữa 1 và 2 gần hơn nhiều với 1 hơn là 2. Mà không cần tra cứu ánh xạ Unicode cho mọi ký tự WE8ISO8859P1 hợp lệ , Tôi sẽ rất ngạc nhiên nếu có bất kỳ bộ nhớ 3 hoặc 4 byte nào được yêu cầu trong bộ ký tự AL32UTF8.
Trong Hướng dẫn hỗ trợ toàn cầu hóa, có một phần về bộ ký tự cho bạn biết bộ ký tự nào là byte đơn, bộ ký tự nào là nhiều byte và bộ ký tự nào trong số các bộ ký tự nhiều byte có chiều rộng cố định. Hầu hết tất cả các bộ ký tự nhiều byte đều có chiều rộng thay đổi, vì vậy yếu tố bạn đang tìm kiếm sẽ phụ thuộc vào dữ liệu của bạn.
Trong hầu hết các trường hợp, bạn nên khai báo các cột của mình để sử dụng ngữ nghĩa độ dài ký tự thay vì ngữ nghĩa độ dài byte, để cơ sở dữ liệu tìm ra đằng sau lượng dữ liệu cần phân bổ. Ví dụ:nếu bạn khai báo một cột
CREATE TABLE foo (
col1 VARCHAR2(10 CHAR)
)
Oracle sẽ phân bổ không gian cho 10 ký tự lưu trữ bất kể bộ ký tự cơ sở dữ liệu và bất kể số byte thực tế cần thiết để lưu trữ dữ liệu đó (tuân theo giới hạn 4000 byte cho mỗi VARCHAR2
cột). Điều đó nói chung làm cho việc xác định kích thước cột dễ dàng hơn nhiều vì bạn không phải vượt quá kích thước các cột trong trường hợp ai đó quyết định ném 10 ký tự 4 byte UTF-8 vào một hàng và bạn không phải giải thích cho người dùng rằng cột sẽ chấp nhận chuỗi có số lượng ký tự khác nhau tùy thuộc vào ngôn ngữ và / hoặc các ký tự cụ thể được chọn.
Mặc dù những người Oracle thường xuyên đối phó với toàn cầu hóa không khuyến khích nó , nếu bạn chỉ định rõ ràng ngữ nghĩa độ dài ký tự khi khai báo các cột của mình hoặc ít nhất chỉ đặt nó ở cấp phiên, bạn có thể đặt NLS_LENGTH_SEMANTICS
tham số khởi tạo
để gây ra VARCHAR2(10)
để sử dụng ngữ nghĩa độ dài ký tự thay vì ngữ nghĩa độ dài byte theo mặc định (bạn vẫn có thể chỉ định VARCHAR2(10 BYTE)
nếu bạn muốn ngữ nghĩa độ dài byte).