En Oracle Database un VARCHAR2(4000) puede almacenar hasta 4000 bytes o hasta 4000 caracteres, dependiendo de cómo fue definida la columna y del parámetro NLS_LENGTH_SEMANTICS.
Pero lo que si estamos casi de acuerdo, es que serían un poco más o menos de 4000 bytes. Esto es una verdad absoluta que no permite discusión, cierto? Pues no.
La afirmación dogmática sería:
“Un campo VARCHAR2(4000) almacena 4000.”
Presentada así, parece una verdad absoluta, casi axiomática. Pero en realidad es una proposición incompleta, porque omite la naturaleza de la unidad medida.
La verdad formal en Oracle sería: “Un VARCHAR2(4000) almacena hasta 4000 unidades de longitud definidas como BYTE o CHAR.”
Y la verdad contextual añade: “En un charset multibyte, 4000 caracteres pueden requerir muchos más bytes; por tanto, la capacidad efectiva en caracteres puede reducirse incluso a una cuarta parte.”
Ejemplo con AL32UTF8 y caracteres de 4 bytes (como muchos emojis): límite declarado: 4000 bytes
cada carácter consume 4 bytes, por tanto la capacidad real: 4000/4=10004000 / 4 = 10004000/4=1000, es decir, solo una cuarta parte de “caracteres” respecto a ASCII.
Desde la filosofía del lenguaje, esto recuerda a Ludwig Wittgenstein:
el significado depende del “juego del lenguaje”
“4000” no significa nada por sí mismo si no se especifica si hablamos de bytes o caracteres.
Desde Aristóteles, sería un problema de sustancia y accidente:
- sustancia: la columna tiene límite 4000.
- accidente: cómo se representa cada símbolo.
Y desde una crítica al absolutismo epistemológico:
“Toda verdad técnica expresada sin contexto tiende a parecer absoluta; al añadir sus condiciones, se revela relativa dentro de un sistema.”
SQL> select BANNER_FULL from v$version;
BANNER_FULL
--------------------------------------------------------------------------------
Oracle AI Database 26ai Enterprise Edition Release 23.26.1.0.0 - Production
Version 23.26.1.0.0
SQL>
SQL> select count(*) from dba_tab_columns
2 where column_name='PASSWORD';
COUNT(*)
----------
15
Dos de los objetos más relevantes en donde se encuentra la columna "PASSWORD", si haz seguido mis lecturas durante estos años, son SYS.USER$ y DBA_USERS. En ambos objetos, el valor de precisión para la columna "PASSWORD" es de 4000 BYTES. Recuerden que ya para el set de caracteres que utilizamos normalmente en Latinoamérica las bases de datos modernas hacen una conversión de caracters a bytes.
SQL> desc sys.USER$
Name Null? Type
----------------------------------------- -------- ----------------------------
USER# NOT NULL NUMBER
NAME NOT NULL VARCHAR2(128)
TYPE# NOT NULL NUMBER
PASSWORD VARCHAR2(4000)
DATATS# NOT NULL NUMBER
TEMPTS# NOT NULL NUMBER
CTIME NOT NULL DATE
PTIME DATE
EXPTIME DATE
LTIME DATE
RESOURCE$ NOT NULL NUMBER
AUDIT$ VARCHAR2(38)
DEFROLE NOT NULL NUMBER
DEFGRP# NUMBER
DEFGRP_SEQ# NUMBER
ASTATUS NOT NULL NUMBER
LCOUNT NOT NULL NUMBER
DEFSCHCLASS VARCHAR2(128)
EXT_USERNAME VARCHAR2(4000)
SPARE1 NUMBER
SPARE2 NUMBER
SPARE3 NUMBER
SPARE4 VARCHAR2(1000)
SPARE5 VARCHAR2(1000)
SPARE6 DATE
SPARE7 VARCHAR2(4000)
SPARE8 VARCHAR2(4000)
SPARE9 NUMBER
SPARE10 NUMBER
SPARE11 TIMESTAMP(6)
SPARE12 NUMBER
SPARE13 NUMBER
SPARE14 NUMBER
SPARE15 DATE
SPARE16 VARCHAR2(4000)
SQL> desc sys.DBA_USERS
Name Null? Type
----------------------------------------- -------- ----------------------------
USERNAME NOT NULL VARCHAR2(128)
USER_ID NOT NULL NUMBER
PASSWORD VARCHAR2(4000)
ACCOUNT_STATUS NOT NULL VARCHAR2(32)
LOCK_DATE DATE
EXPIRY_DATE DATE
DEFAULT_TABLESPACE NOT NULL VARCHAR2(30)
TEMPORARY_TABLESPACE NOT NULL VARCHAR2(30)
LOCAL_TEMP_TABLESPACE VARCHAR2(30)
CREATED NOT NULL DATE
PROFILE NOT NULL VARCHAR2(128)
INITIAL_RSRC_CONSUMER_GROUP VARCHAR2(128)
EXTERNAL_NAME VARCHAR2(4000)
PASSWORD_VERSIONS VARCHAR2(17)
EDITIONS_ENABLED VARCHAR2(1)
AUTHENTICATION_TYPE VARCHAR2(8)
PROXY_ONLY_CONNECT VARCHAR2(1)
COMMON VARCHAR2(3)
LAST_LOGIN TIMESTAMP(9) WITH TIME ZONE
ORACLE_MAINTAINED VARCHAR2(1)
INHERITED VARCHAR2(3)
DEFAULT_COLLATION VARCHAR2(100)
IMPLICIT VARCHAR2(3)
ALL_SHARD VARCHAR2(3)
EXTERNAL_SHARD VARCHAR2(3)
PASSWORD_CHANGE_DATE DATE
MANDATORY_PROFILE_VIOLATION VARCHAR2(3)
PROTECTED VARCHAR2(3)
READ_ONLY VARCHAR2(3)
DICTIONARY_PROTECTED VARCHAR2(3)
CLOUD_MAINTAINED VARCHAR2(3)
APPLICATION VARCHAR2(3)
MFA VARCHAR2(9)
SQL>
La columna esta definida para un tamaño más grande, pero sólo se pueden crear contraseñas con el tamaño máximo de 1024 bytes.
Veamos un ejemplo:
SQL> alter user seguro_seguro identified by EsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoS;
User altered.
SQL> alter user seguro_seguro identified by EsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSuper;
alter user seguro_seguro identified by EsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSilodiceconsolturasonaraarmoniosoSupercalifragilisticoexpialidosoEsSupercalifragilisticoexpialidosoaunquesueneextravaganteraroyespantosoSuper
*
ERROR at line 1:
ORA-28218: password length more than 1024 bytes
Help: https://docs.oracle.com/error-help/db/ora-28218/
“Toda verdad técnica expresada sin contexto tiende a parecer absoluta; al añadir sus condiciones, se revela relativa dentro de un sistema.”

No hay comentarios:
Publicar un comentario
Te agradezco tus comentarios. Te esperamos de vuelta.