Oracle
 sql >> Database >  >> RDS >> Oracle

Vera lunghezza di una stringa, come visto da Oracle

Puoi, come altri hanno mostrato, convertire la stringa Java in un array di byte utilizzando il set di caratteri del database Oracle e quindi ottenere la lunghezza in byte da quello. Ciò si basa, tuttavia, sulla conoscenza del set di caratteri del database:database diversi avranno set di caratteri diversi che risulteranno in lunghezze di byte diverse per la stessa stringa in set di caratteri diversi.

Supponendo che il tuo database stia utilizzando un set di caratteri a larghezza variabile come UTF-8 (NLS_CHARACTERSET di AL32UTF8), puoi anche dichiarare colonne in Oracle in base alla lunghezza del carattere anziché alla lunghezza del byte. Ciò può semplificare il tuo codice poiché puoi semplicemente controllare la lunghezza dei caratteri della tua stringa. Semplifica inoltre la comunicazione per gli utenti. In genere è difficile per gli utenti capire perché un campo a volte può memorizzare 5 caratteri mentre altre volte rifiuta una stringa di 2 caratteri a seconda dei caratteri che fanno parte della stringa (1 carattere nel set di caratteri UTF-8 può richiedere fino a 3 byte di stoccaggio).

Per impostazione predefinita, quando dichiari una colonna

CREATE TABLE foo (
  col_name VARCHAR2(5)
);

che dice a Oracle di consentire fino a 5 byte di dati. Se vuoi consentire 5 caratteri di dati indipendentemente dal numero di byte, tuttavia, puoi utilizzare la semantica della lunghezza dei caratteri

CREATE TABLE foo (
  col_name VARCHAR2(5 CHAR)
);

Supponendo che tu voglia farlo per tutte le tue tabelle mentre esegui il tuo DDL, puoi anche impostare nls_length_semantics a livello di sessione prima di eseguire il DDL

ALTER SESSION SET nls_length_semantics = CHAR;

CREATE TABLE foo (
  col_name VARCHAR2(5)
);

crea una tabella con una colonna che consente fino a 5 caratteri di dati.