it-swarm-es.com

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

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 para almacenar 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, ya que algunos de ellos requieren más de un byte para almacenar, por ejemplo. Caracteres no ingleses.

Al definir el campo como VARCHAR2(11 CHAR) le dices a Oracle que 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.

249
David Sykes

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

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

20
Matthias Kestenholz

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

  1. Limita el campo a 11 Caracteres
  2.  



16
user15453

No estoy seguro ya que no soy un usuario de Oracle, pero supongo que la diferencia radica en el uso de conjuntos de caracteres de múltiples bytes 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 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 sobre Oracle) .

3
Seldaek