Можете, както показаха други, да конвертирате низа на Java в масив от байтове, като използвате набора от символи на базата данни на Oracle и след това да получите дължината в байтове от това. Това обаче зависи от това да знаете какъв е наборът от знаци на вашата база данни - различните бази данни ще имат различни набори от знаци, което ще доведе до различни дължини на байтове за един и същ низ в различни набори от знаци.
Ако приемем, че вашата база данни използва набор от знаци с променлива ширина като UTF-8 (NLS_CHARACTERSET
на AL32UTF8), можете също да декларирате колони в Oracle въз основа на дължината на знака, а не на дължината на байта. Това може да опрости вашия код, тъй като можете просто да проверите дължината на знака на вашия низ. Той също така опростява комуникацията за потребителите. По принцип е трудно за потребителите да разберат защо едно поле понякога може да съхранява 5 знака, докато друг път отхвърля низ от 2 знака в зависимост от знаците, които са част от низа (1 знак в набора от символи UTF-8 може да изисква до 3 байта на съхранение).
По подразбиране, когато декларирате колона
CREATE TABLE foo (
col_name VARCHAR2(5)
);
което казва на Oracle да разреши до 5 байта данни. Ако обаче искате да разрешите 5 знака данни, независимо от броя на байтовете, можете да използвате семантика за дължина на знака
CREATE TABLE foo (
col_name VARCHAR2(5 CHAR)
);
Ако приемем, че искате да направите това за всичките си таблици, докато изпълнявате своя DDL, можете също да зададете nls_length_semantics
на ниво сесия, преди да стартирате вашия DDL
ALTER SESSION SET nls_length_semantics = CHAR;
CREATE TABLE foo (
col_name VARCHAR2(5)
);
създава таблица с колона, която позволява до 5 знака данни.