Aunque ya hay varias respuestas que describen correctamente el comportamiento de char
, creo que hay que decir que no deberías usarlo excepto en tres situaciones específicas:
- Está creando un archivo o informe de longitud fija y asignando un valor no nulo a un
char
evita la necesidad de codificar unrpad()
expresión. Por ejemplo, sifirstname
ylastname
ambos están definidos comochar(20)
, luegofirstname || lastname
es una forma más corta de escribirrpad(firstname,20) || rpad(lastname,20)
para crearChuck Norris
. - Debe distinguir entre la cadena vacía explícita
''
ynull
. Normalmente son lo mismo en Oracle, pero asignando''
a unchar
value activará su comportamiento de relleno en blanco mientras quenull
no lo hará, así que si es importante notar la diferencia, y realmente no puedo pensar en una razón por la que sería, entonces tienes una manera de hacerlo. - Su código se transfirió (o debe ser compatible con) algún otro sistema que requiere relleno en blanco por motivos heredados. En ese caso, te quedas con él y tienes mi simpatía.
Realmente no hay razón para usar char
solo porque se fija cierta longitud (por ejemplo, un Y/N
bandera o un código de moneda ISO como 'USD'
). No es más eficiente, no ahorra espacio (no hay un indicador de longitud mítico para un varchar2
, solo hay una sobrecarga de relleno en blanco para char
), y no impide que nadie ingrese valores más cortos. (Si ingresa 'ZZ'
en tu char(3)
columna de moneda, simplemente se almacenará como 'ZZ '
.) Ni siquiera es compatible con versiones anteriores de Oracle que una vez se basó en él, porque nunca hubo uno.
Y el contagio puede extenderse, ya que (siguiendo las mejores prácticas) puede anclar una declaración de variable usando algo como sales.currency%type
. Ahora su l_sale_currency
la variable es un char
sigiloso que se rellenará invisiblemente en blanco para valores más cortos (o ''
), abriendo la puerta a errores oscuros donde l_sale_currency
no es igual a l_refund_currency
a pesar de que asignó 'ZZ'
a ambos.
Algunos argumentan que char(n)
(donde n tiene una longitud de algunos caracteres) indica que se espera que los valores sean n caracteres de largo, y esta es una forma de auto-documentación. Pero sin duda, si se toma en serio un formato de 3 caracteres (códigos de país ISO-Alfa-3 en lugar de ISO-Alfa-2, por ejemplo), ¿no definiría una restricción para hacer cumplir la regla, en lugar de dejar que los desarrolladores echen un vistazo a un char(3)
tipo de datos y sacar sus propias conclusiones?
CHAR
se introdujo en Oracle 6 por, estoy seguro, razones de compatibilidad con ANSI. Probablemente haya clientes potenciales que decidan qué producto de base de datos comprar y compatibilidad con ANSI está en su lista de verificación (o solía estar en ese entonces), y CHAR
con relleno en blanco se define en el estándar ANSI, por lo que Oracle debe proporcionarlo. Se supone que en realidad no debes usarlo.