¿Cuál es la principal diferencia entre Varchar2 y char?
Creando tabla:
CREATE TABLE test (
charcol CHAR(10),
varcharcol VARCHAR2(10));
SELECT LENGTH(charcol), LENGTH(varcharcol) FROM test;
Resultado:
LENGTH(CHARCOL) LENGTH(VARCHARCOL)
--------------- ------------------
10 1
Déjame saber cuál es la diferencia entre Varchar2 y char. ¿En qué momentos utilizamos ambos?
Aunque ya hay varias respuestas que describen correctamente el comportamiento de char
, creo que hay que decir que no debes usarlo excepto en tres situaciones específicas:
- Está creando un archivo o informe de longitud fija y asignando un valor no nulo a
char
evita la necesidad de codificar unarpad()
expresión. Por ejemplo, sifirstname
ylastname
están definidos comochar(20)
, entoncesfirstname||lastname
es una forma más corta de escribirrpad(firstname,20)||rpad(lastname,20)
para crear
Chuck Norris
- Debe distinguir entre la cadena vacía explícita
''
ynull
. Normalmente son lo mismo en Oracle, pero asignar''
unchar
valor activará su comportamiento de relleno en blanco mientras quenull
no lo hará, por lo que si es importante notar la diferencia, y realmente no puedo pensar en una razón por la cual sería así, 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 motivos heredados. En ese caso, usted se verá obligado a hacerlo y cuenta con mi simpatía.
Realmente no hay razón para usarlochar
simplemente porque alguna longitud sea fija (por ejemplo, una 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 a varchar2
, solo hay un relleno en blanco para char
) y no impide que nadie ingrese valores más cortos. (Si ingresa 'ZZ'
en su char(3)
columna de moneda, simplemente se almacenará como 'ZZ '
). Ni siquiera es compatible con alguna versión antigua de Oracle que alguna vez dependió de él, porque nunca existió una.
Y el contagio puede extenderse, ya que (siguiendo las mejores prácticas) puedes anclar una declaración de variable usando algo como sales.currency%type
. Ahora su l_sale_currency
variable es un sigilo char
que se rellenará de manera invisible en blanco para valores más cortos (o ''
), abriendo la puerta a errores oscuros donde l_sale_currency
no es igual l_refund_currency
a pesar de que los haya asignado 'ZZ'
a ambos.
Algunos argumentan que char(n)
(donde n es una longitud de caracteres) indica que se espera que los valores tengan n caracteres de longitud, y esto es una forma de autodocumentación. Pero seguramente, si se toma en serio el 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? un char(3)
tipo de datos y sacar sus propias conclusiones?
CHAR
se introdujo en Oracle 6, estoy seguro, por razones de compatibilidad ANSI. Probablemente hay clientes potenciales que deciden qué producto de base de datos comprar y la compatibilidad ANSI está en su lista de verificación (o solía estar en ese entonces), y CHAR
el relleno en blanco está definido en el estándar ANSI, por lo que Oracle debe proporcionarlo. Se supone que no debes usarlo.
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, el código postal de los estados de EE. UU., por ejemplo CA, NY, FL, TX.
Sólo para evitar confusión sobre mucha información incorrecta. Aquí hay información sobre las diferencias, 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 tabla t ( x varchar2(30), y char(30) ); insertar en valores t (x,y) ( rpad('a',' ',30), 'a' );
ES ABSOLUTAMENTE NADA, y dado que la diferencia entre las columnas X e Y a continuación:
insertar en valores t (x,y) ('a','a')
es que X consume 3 bytes (indicador nulo, longitud del byte inicial, 1 byte para 'a') e Y consume 32 bytes (indicador nulo, longitud del byte inicial, 30 bytes para 'a')
Umm, varchar2 tendrá una cierta "ventaja en cuanto a rendimiento". NO nos ayuda en absoluto que char(30) tenga siempre 30 bytes; para nosotros, es simplemente un varchar2 que se rellena en blanco hasta la longitud máxima. Nos ayuda en el procesamiento: CERO, nada, zippo.
Cada vez que veas a alguien decir "es hasta un 50% más rápido", y eso es todo - sin ejemplos, 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 una posición específica entre sí, el sistema no tiene que buscar el final de la cadena. Mientras que en VARCHAR el sistema primero tiene que encontrar el final de la cadena y luego buscar buscando."
FALSO: un carácter es solo un espacio en blanco varchar2 relleno; no almacenamos cadenas "en una posición específica entre sí". Buscamos el final de la cadena; utilizamos una longitud de byte inicial para resolver las cosas.
CARBONIZARSE
CHAR debe usarse para almacenar cadenas de caracteres de longitud fija. Los valores de cadena se rellenarán con espacios o espacios en blanco antes de almacenarse en el disco. Si este tipo se utiliza para almacenar cadenas de longitud variable, se desperdiciará mucho espacio en disco.
VARCHAR2
VARCHAR2 se utiliza para almacenar cadenas de caracteres de longitud variable. La longitud del valor de la cadena se almacenará en el disco con el valor mismo.
Y
At what times we use both?
Todo depende de sus necesidades.