Diferencia entre BYTE y CHAR en tipos de datos de columna

166

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
)
Guido
fuente

Respuestas:

265

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 requieren más de un byte para almacenar, por ejemplo, caracteres que no están en inglés.

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

David Sykes
fuente
55
Tenga en cuenta que la semántica de longitud de caracteres no afecta la longitud máxima de 4000 bytes para a VARCHAR2. Declarar a VARCHAR2(4000 CHAR)permitirá menos de 4000 caracteres si algunos de los caracteres requieren múltiples bytes de almacenamiento.
Justin Cave
@David Sykes ¿Es semánticamente lo mismo con NVARCHAR (11)?
Siesta
@Nap No que yo sepa. Creo que el parámetro de tamaño en la declaración de tipo NVARCHAR tiene el significado que en VARCHAR2. es decir, para garantizar suficiente espacio de almacenamiento para 11 caracteres (no bytes) en el juego de caracteres NVARCHAR, diría NVARCHAR (11 CHAR). NOTA: en realidad no he verificado esto. Nunca he usado NVARCHAR.
David Sykes
Para ilustrar aún más la diferencia entre los dos: cuatro caracteres de un valor codificado en hexadecimal (es decir, "0xFF") o tres caracteres decimales (es decir, "255") podrían "comprimirse" cuando se representan como un solo byte: 11111111. Esto podría entonces ser útil para indicadores de bits (hasta 8 posiciones), operaciones bit a bit, etc.
Matt Borja
Tenga en cuenta que 1 como carácter ASCII (dec. 49) es 1001001 mientras que 1 como bit es 00000001.
Matt Borja,
21

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 carácter, por lo tanto, el campo de 11 bytes puede tener espacio para menos de 11 caracteres dependiendo de la codificación.

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

Matthias Kestenholz
fuente
17

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

  1. Limita el campo a 11 BYTE
  2. Limita al campo 11 CHAR teres


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

usuario15453
fuente
4

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

Además, esos tipos de campo podrían tratarse de manera diferente con respecto a los caracteres acentuados o el caso, por ejemplo, 'binaryField (ete) = "été"' no coincidirá mientras que 'charField (ete) = "été"' podría (de nuevo, no estoy seguro acerca de Oracle) .

Seldaek
fuente