sql - describe - ¿Cuál es la principal diferencia entre Varchar2 y char
describe table sql (6)
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 en las que la longitud de los caracteres siempre es fija, por ejemplo, el código postal para los estados de EE. UU., Por ejemplo, CA, NY, FL, TX
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
Por favor, déjame saber cuál es la diferencia entre Varchar2 y char? ¿En qué momentos usamos ambos?
Este es un hilo antiguo, pero es el primero de una búsqueda en Google de ''Oracle char vs varchar2'' , y si bien ya hay varias respuestas que describen correctamente el comportamiento de char
, creo que se debe decir que no se debe usar. Excepto en dos situaciones específicas:
- Está creando un archivo o informe de longitud fija, y al asignar un valor no nulo a un
char
evita la necesidad de codificar una expresiónrpad()
. Por ejemplo, si el nombre y ellastname
se definen comochar(20)
, entonces el nombrefirstname || lastname
firstname || lastname
es una forma más corta de escribirrpad(firstname,20) || rpad(lastname,20)
rpad(firstname,20) || rpad(lastname,20)
. - Debe distinguir entre la cadena vacía explícita
''''
ynull
. Normalmente son lo mismo en Oracle, pero la asignación de''''
a un valor dechar
desencadenará su comportamiento de relleno en blanco, mientras que elnull
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 hacer eso.
Realmente no hay ninguna razón para usar char
solo porque alguna longitud es fija (por ejemplo, una bandera Y/N
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 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 su columna de moneda char(3)
, simplemente se almacenará como ''ZZ ''
). Ni siquiera es compatible con alguna versión antigua de Oracle que alguna vez se basó en ella, porque nunca hubo una .
Y el contagio puede propagarse, ya que (siguiendo las mejores prácticas) puede anclar una declaración de variable utilizando algo como el sales.currency%type
. Ahora, su variable l_sale_currency
es un l_sale_currency
furtivo que se volverá invisible para valores más cortos (o ''''
), abriendo la puerta para ocultar errores donde l_sale_currency
no es igual a l_refund_currency
aunque haya asignado ''ZZ''
a ambos.
CHAR
se introdujo en Oracle 6 por motivos de compatibilidad con ANSI. Probablemente hay clientes potenciales que deciden qué producto de base de datos comprar y la compatibilidad con ANSI está en su lista de verificación (o que 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. No se supone que realmente lo uses.
Sólo para evitar confusiones sobre mucha información errónea. Aquí hay alguna información sobre la diferencia, incluyendo el rendimiento.
Referencia: https://asktom.oracle.com/pls/asktom/f?p=100:11:0:::P11_QUESTION_ID:2668391900346844476
Dado que un char no es más que un VARCHAR2 que está en blanco rellenado 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 t (x, y) valores (rpad (''a'', '''', 30), ''a'');
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 (indicador nulo, longitud de byte inicial, 1 byte para ''a'') e Y consume 32 bytes (indicador nulo, longitud de byte inicial, 30 bytes para ''a'')
Umm, varchar2 va a ser algo "ventajoso en cuanto al rendimiento". No nos sirve de nada que char (30) sea siempre de 30 bytes; para nosotros, es simplemente un varchar2 que está en blanco rellenado hasta la longitud máxima. Nos ayuda en el procesamiento - CERO, zilch, zippo.
Cada vez que vea a alguien decir "es hasta un 50% más rápido", y eso es todo: no hay ejemplo, no hay ciencia, no hay hechos, no hay una historia que lo respalde, solo ríete a carcajadas y sigue avanzando.
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 una de la otra, el sistema no tiene que buscar el final de la cadena. Mientras que en VARCHAR, el sistema tiene que encontrar primero el final de la cadena y luego buscar buscando."
FALSO: un char es solo un espacio en blanco varchar2 acolchado - no almacenamos cadenas "en una posición específica entre sí". Buscamos el final de la cadena: usamos una longitud de byte inicial para resolver las cosas.
CARBONIZARSE
CHAR se debe utilizar para almacenar cadenas de caracteres de longitud fija. Los valores de cadena se rellenarán con espacios / espacios en blanco antes de almacenarlos en el disco. Si este tipo se utiliza para almacenar cadenas de longitud de varibales, perderá una gran cantidad de 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 en sí.
Y
At what times we use both?
Todo depende de su requerimiento.
CHAR se utiliza para almacenar cadenas de caracteres de longitud fija. Se desperdiciará una gran cantidad de espacio en disco si este tipo se utiliza para almacenar cadenas de longitud varibale.
VARCHAR2 se utiliza para almacenar cadenas de caracteres de longitud variable.
¿En qué momentos usamos ambos?
Esto puede variar y depender de su requerimiento.
EDITAR:-
Entendamos esto con un ejemplo, si tiene una columna de nombre de estudiante con tamaño 10; sname CHAR(10)
y si se inserta un valor de columna ''RAMA''
se insertarán 6 espacios vacíos a la derecha del valor. Si esta era una columna VARCHAR; Sname VARCHAR2(10).
Luego, Varchar tomará 4 espacios de 10 posibles y liberará los 6 siguientes para otro uso.
El tipo CHAR tiene un tamaño fijo, por lo que si usted dice que es de 10 bytes, entonces siempre almacena 10 bytes en la base de datos y no importa si almacena algún texto o simplemente vacía 10 bytes.
El tamaño de VARCHAR2 depende de la cantidad de bytes que realmente va a almacenar en la base de datos. El número que especifique es solo el número máximo de bytes que se pueden almacenar (aunque 1 byte es el mínimo)
Debe usar CHAR cuando se trata de cadenas de longitud fija (sabe de antemano la longitud exacta de la cadena que va a almacenar): la base de datos puede manipularla mejor y más rápidamente, ya que conoce la longitud exacta
Debe utilizar VARCHAR2 cuando no sepa la longitud exacta de las cadenas almacenadas.
La situación que usarías de ambos puede ser:
name VARCHAR2(255),
zip_code CHAR(5) --if your users have only 5 place zip codes