U kunt, zoals anderen hebben laten zien, de Java-tekenreeks converteren naar een bytearray met behulp van de tekenset van de Oracle-database en daaruit de lengte in bytes halen. Dat is echter afhankelijk van het weten wat de tekenset van uw database is - verschillende databases hebben verschillende tekensets, wat resulteert in verschillende bytelengtes voor dezelfde tekenreeks in verschillende tekensets.
Ervan uitgaande dat uw database een tekenset met variabele breedte gebruikt, zoals UTF-8 (NLS_CHARACTERSET
van AL32UTF8), kunt u in Oracle ook kolommen declareren op basis van de tekenlengte in plaats van de bytelengte. Dat kan je code vereenvoudigen, omdat je gewoon de tekenlengte van je string kunt controleren. Het vereenvoudigt ook de communicatie voor gebruikers. Het is over het algemeen moeilijk voor gebruikers om te begrijpen waarom een veld soms 5 tekens kan bevatten, terwijl het soms een tekenreeks van 2 tekens verwerpt, afhankelijk van de tekens die deel uitmaken van de tekenreeks (1 teken in de UTF-8-tekenset kan tot 3 bytes vereisen opslagruimte).
Standaard, wanneer u een kolom declareert
CREATE TABLE foo (
col_name VARCHAR2(5)
);
dat vertelt Oracle om maximaal 5 bytes aan gegevens toe te staan. Als u echter 5 tekens aan gegevens wilt toestaan, ongeacht het aantal bytes, kunt u tekenlengtesemantiek gebruiken
CREATE TABLE foo (
col_name VARCHAR2(5 CHAR)
);
Ervan uitgaande dat je dit voor al je tabellen wilt doen terwijl je DDL draait, kun je ook nls_length_semantics
instellen op sessieniveau voordat u uw DDL uitvoert
ALTER SESSION SET nls_length_semantics = CHAR;
CREATE TABLE foo (
col_name VARCHAR2(5)
);
creëert een tabel met een kolom die maximaal 5 tekens aan gegevens toestaat.