Diferencia entre BYTE y CHAR en tipos de datos de columna


En Oracle, ¿cuál es la diferencia entre:

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 BYTE),
 ID_CLIENT NUMBER
)

Y

CREATE TABLE CLIENT
(
 NAME VARCHAR2(11 CHAR), -- or even VARCHAR2(11)
 ID_CLIENT NUMBER
)
Author: emaillenin, 2008-09-17

4 answers

Supongamos que el conjunto de caracteres de la base de datos es UTF-8, que es la configuración recomendada en las versiones recientes de Oracle. En este caso, algunos caracteres tardan más de 1 byte en almacenarse en la base de datos.

Si define el campo como VARCHAR2(11 BYTE), Oracle puede usar hasta 11 bytes para el almacenamiento, pero es posible que no pueda almacenar 11 caracteres en el campo, porque algunos de ellos necesitan más de un byte para almacenar, por ejemplo, caracteres no ingleses.

Al definir el campo como VARCHAR2(11 CHAR) le dices a Oracle puede usar suficiente espacio para almacenar 11 caracteres, sin importar cuántos bytes se necesiten para almacenar cada uno. Un solo carácter puede requerir hasta 4 bytes.

 233
Author: David Sykes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-09 06:38:52

Uno tiene exactamente espacio para 11 bytes, el otro para exactamente 11 caracteres. Algunos conjuntos de caracteres como las variantes Unicode pueden usar más de un byte por char, por lo tanto el campo de 11 bytes puede tener espacio para menos de 11 caracteres dependiendo de la codificación.

Véase también http://www.joelonsoftware.com/articles/Unicode.html

 19
Author: Matthias Kestenholz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 09:37:02

Dependiendo de la configuración del sistema, el tamaño del CHAR medido en BYTES puede variar. En sus ejemplos:

  1. Limita el campo a 11 BYTE
  2. Limita el campo a 11 CARACTERESactuadores


Conclusión: 1 CHAR no es igual a 1 BYTE.

 15
Author: user15453,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 10:13:00

No estoy seguro ya que no soy un usuario de Oracle, pero asumo que la diferencia radica cuando se utilizan conjuntos de caracteres multi-byte como Unicode (UTF-16/32). En este caso, 11 bytes podrían representar menos de 11 caracteres.

También esos tipos de campo podrían ser tratados de manera diferente en cuanto a caracteres acentuados o mayúsculas, por ejemplo 'binaryField(ete) = "été"' no coincidirá, mientras que 'CharField(ete) = "été"' podría (de nuevo no estoy seguro acerca de Oracle).

 3
Author: Seldaek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-17 09:31:25