Bạn có thể, như những người khác đã trình bày, chuyển đổi chuỗi Java thành một mảng byte bằng cách sử dụng bộ ký tự của cơ sở dữ liệu Oracle và sau đó lấy độ dài tính bằng byte từ đó. Tuy nhiên, điều đó phụ thuộc vào việc biết bộ ký tự của cơ sở dữ liệu của bạn là gì - các cơ sở dữ liệu khác nhau sẽ có các bộ ký tự khác nhau, dẫn đến độ dài byte khác nhau cho cùng một chuỗi trong các bộ ký tự khác nhau.
Giả sử rằng cơ sở dữ liệu của bạn đang sử dụng bộ ký tự có độ rộng thay đổi như UTF-8 (NLS_CHARACTERSET
của AL32UTF8), bạn cũng có thể khai báo các cột trong Oracle dựa trên độ dài ký tự thay vì độ dài byte. Điều đó có thể đơn giản hóa mã của bạn vì bạn chỉ có thể kiểm tra độ dài ký tự trong chuỗi của mình. Nó cũng đơn giản hóa giao tiếp cho người dùng. Nói chung, người dùng khó hiểu tại sao một trường đôi khi có thể lưu trữ 5 ký tự trong khi những trường hợp khác lại từ chối một chuỗi 2 ký tự tùy thuộc vào các ký tự là một phần của chuỗi (1 ký tự trong bộ ký tự UTF-8 có thể yêu cầu tối đa 3 byte lưu trữ).
Theo mặc định, khi bạn khai báo một cột
CREATE TABLE foo (
col_name VARCHAR2(5)
);
điều đó cho phép Oracle cho phép tối đa 5 byte dữ liệu. Tuy nhiên, nếu bạn muốn cho phép 5 ký tự dữ liệu bất kể số byte, bạn có thể sử dụng ngữ nghĩa độ dài ký tự
CREATE TABLE foo (
col_name VARCHAR2(5 CHAR)
);
Giả sử bạn muốn thực hiện việc này cho tất cả các bảng của mình trong khi chạy DDL, bạn cũng có thể đặt nls_length_semantics
ở cấp độ phiên trước khi chạy DDL của bạn
ALTER SESSION SET nls_length_semantics = CHAR;
CREATE TABLE foo (
col_name VARCHAR2(5)
);
tạo một bảng với một cột cho phép tối đa 5 ký tự dữ liệu.