Si encuentras algo que no entiendes nos puedes dejar un comentario y te responderemos tan rápido como podamos.
Solución:
Aunque ya existen varias respuestas que describen correctamente el comportamiento de char
, Creo que hay que decirlo no deberías usarlo excepto en tres situaciones específicas:
- Está creando un archivo o informe de longitud fija y asigna unnull valor a un
char
evita la necesidad de codificar unrpad()
expresión. Por ejemplo, sifirstname
ylastname
ambos se definen comochar(20)
, luegofirstname || lastname
es una forma más corta de escribirrpad(firstname,20) || rpad(lastname,20)
crearChuck Norris
. - Necesitas distinguir entre el vacío explícito string
''
ynull
. Normalmente son lo mismo en Oracle, pero asignando''
a unchar
value activará su comportamiento de relleno en blanco mientrasnull
no lo hará, así que si es importante notar la diferencia, y realmente no puedo pensar en una razón por la que lo sería, entonces tienes una manera de hacerlo. - Su código se transfiere desde (o debe ser compatible con) algún otro sistema que requiere relleno en blanco por razones heredadas. En ese caso, está atascado y tiene mi simpatía.
Realmente hay no hay razón para usar char
solo porque alguna longitud es fija (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 tus char(3)
columna de moneda, simplemente se almacenará como 'ZZ '
.) Ni siquiera es compatible con versiones anteriores de alguna versión antigua de Oracle que alguna 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 tu l_sale_currency
variable es un sigilo char
que se rellenará de forma invisible en blanco para valores más cortos (o ''
), abriendo la puerta a errores ocultos donde l_sale_currency
no es igual l_refund_currency
a pesar de que asignaste 'ZZ'
a ambos.
Algunos argumentan que char(n)
(dónde norte tiene una longitud de caracteres) indica que se espera que los valores sean norte caracteres de longitud, y esta es una forma de auto-documentación. Pero seguramente si se toma en serio un formato de 3 caracteres (códigos de país ISO-Alpha-3 en lugar de ISO-Alpha-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 char(3)
tipo de datos y sacar sus propias conclusiones?
CHAR
se introdujo en Oracle 6, estoy seguro, por razones de compatibilidad con ANSI. Probablemente hay clientes potenciales que deciden qué producto de base de datos comprar y Compatibilidad 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 no debes usarlo realmente.
Ejemplo simple para mostrar la diferencia:
SELECT
'"'||CAST('abc' AS VARCHAR2(10))||'"',
'"'||CAST('abc' AS CHAR(10))||'"'
FROM dual;
'"'||CAST('ABC'ASVARCHAR2(10))||'"' '"'||CAST('ABC'ASCHAR(10))||'"'
----------------------------------- -------------------------------
"abc" "abc "
1 row selected.
El CHAR es útil para expresiones donde la longitud de los caracteres siempre es fija, por ejemplo, código postal para estados de EE. UU., Por ejemplo, CA, NY, FL, TX.
Solo para evitar confusiones sobre mucha información incorrecta. Aquí hay información sobre la diferencia, incluido el rendimiento.
Referencia: https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:2668391900346844476
Dado que un carácter no es más que un VARCHAR2 que se rellena en blanco hasta la longitud máxima, es decir, la diferencia entre las columnas X e Y a continuación:
crear la tabla t (x varchar2 (30), y char (30)); insertar en t (x, y) valores (rpad (‘a’, ”, 30), ‘a’);
NO ES ABSOLUTAMENTE NADA, y dado que la diferencia entre las columnas X e Y a continuación:
insertar en t (x, y) valores (‘a’, ‘a’)
es que X consume 3 bytes (null indicador, longitud de byte inicial, 1 byte para ‘a’) e Y consume 32 bytes (null indicador, longitud de byte inicial, 30 bytes para ‘a’)
Umm, varchar2 va a ser algo “con una ventaja en cuanto a rendimiento”. NO nos ayuda EN ABSOLUTO que char (30) sea siempre de 30 bytes; para nosotros, es simplemente un varchar2 que está en blanco relleno hasta la longitud máxima. Nos ayuda en el procesamiento: ZERO, zilch, zippo.
Cada vez que veas a alguien decir “es hasta un 50% más rápido”, y eso es todo, sin ejemplo, sin ciencia, sin hechos, sin historia que lo respalde, simplemente ríete a carcajadas de ellos y sigue adelante.
También hay otras “cosas inventadas” en esa página, por ejemplo:
“La búsqueda es más rápida en CHAR, ya que todas las cadenas se almacenan en unposición especificada entre sí, el sistema no tiene quebuscar el final de string. Mientras que en VARCHAR el sistema tiene queprimero encuentra el final de string y luego ir a buscar “.
FALSO: un char es solo un espacio en blanco varchar2 relleno; no almacenamos cadenas “en una posición específica entre sí”. Buscamos el final de la string – utilizamos una longitud de byte inicial para resolver las cosas.
Acuérdate de que tienes permiso de agregar una reseña .