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

¿Cuál es la principal diferencia entre Varchar2 y char?

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:

  1. Está creando un archivo o informe de longitud fija y asignando un valor no nulo a un char evita la necesidad de codificar un rpad() expresión. Por ejemplo, si firstname y lastname ambos están definidos como char(20) , luego firstname || lastname es una forma más corta de escribir rpad(firstname,20) || rpad(lastname,20) para crear Chuck Norris .
  2. Debe distinguir entre la cadena vacía explícita '' y null . Normalmente son lo mismo en Oracle, pero asignando '' a un char value activará su comportamiento de relleno en blanco mientras que null 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.
  3. 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.