sql >> Base de Datos >  >> RDS >> Oracle

Longitud real de una cadena, como lo ve Oracle

Puede, como han demostrado otros, convertir la cadena de Java en una matriz de bytes utilizando el conjunto de caracteres de la base de datos de Oracle y luego obtener la longitud en bytes de eso. Sin embargo, eso depende de saber cuál es el conjunto de caracteres de su base de datos:diferentes bases de datos tendrán diferentes conjuntos de caracteres, lo que dará como resultado diferentes longitudes de bytes para la misma cadena en diferentes conjuntos de caracteres.

Suponiendo que su base de datos utiliza un conjunto de caracteres de ancho variable como UTF-8 (NLS_CHARACTERSET de AL32UTF8), también puede declarar columnas en Oracle en función de la longitud de caracteres en lugar de la longitud de bytes. Eso puede simplificar su código ya que solo puede verificar la longitud de caracteres de su cadena. También simplifica la comunicación para los usuarios. En general, es difícil para los usuarios entender por qué un campo a veces puede almacenar 5 caracteres mientras que otras veces rechaza una cadena de 2 caracteres dependiendo de los caracteres que forman parte de la cadena (1 carácter en el juego de caracteres UTF-8 puede requerir hasta 3 bytes de almacenamiento).

Por defecto, cuando declaras una columna

CREATE TABLE foo (
  col_name VARCHAR2(5)
);

que le dice a Oracle que permita hasta 5 bytes de datos. Sin embargo, si desea permitir 5 caracteres de datos independientemente de la cantidad de bytes, puede usar la semántica de longitud de caracteres

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

Suponiendo que desea hacer esto para todas sus tablas mientras ejecuta su DDL, también puede configurar nls_length_semantics a nivel de sesión antes de ejecutar su DDL

ALTER SESSION SET nls_length_semantics = CHAR;

CREATE TABLE foo (
  col_name VARCHAR2(5)
);

crea una tabla con una columna que permite hasta 5 caracteres de datos.