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

Resuelto ram12393 asked hace 10 años • 7 respuestas

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?

ram12393 avatar Dec 06 '13 13:12 ram12393
Aceptado

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:

  1. Está creando un archivo o informe de longitud fija y asignando un valor no nulo a charevita la necesidad de codificar una rpad()expresión. Por ejemplo, si firstnamey lastnameestán definidos como char(20), entonces firstname||lastnamees 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 asignar ''un charvalor activará su comportamiento de relleno en blanco mientras que nullno 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.
  3. 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/Nbandera 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_currencyvariable es un sigilo charque se rellenará de manera invisible en blanco para valores más cortos (o ''), abriendo la puerta a errores oscuros donde l_sale_currencyno es igual l_refund_currencya 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?

CHARse 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 CHARel relleno en blanco está definido en el estándar ANSI, por lo que Oracle debe proporcionarlo. Se supone que no debes usarlo.

William Robertson avatar Feb 10 '2017 17:02 William Robertson

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.

Wernfried Domscheit avatar Dec 06 '2013 07:12 Wernfried Domscheit

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.

Anddo avatar Nov 02 '2017 10:11 Anddo

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.

4b0 avatar Dec 06 '2013 06:12 4b0