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
)
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.
VARCHAR2
. Declarar aVARCHAR2(4000 CHAR)
permitirá menos de 4000 caracteres si algunos de los caracteres requieren múltiples bytes de almacenamiento.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
fuente
Dependiendo de la configuración del sistema, el tamaño de CHAR medido en BYTES puede variar. En tus ejemplos:
Conclusión: 1 CHAR no es igual a 1 BYTE.
fuente
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) .
fuente