2008-09-17 14 views

Respuesta

219

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 toman 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, porque algunos de ellos llevan más de un byte a almacenar, p. caracteres no ingleses

Al definir el campo como VARCHAR2(11 CHAR), le dice 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.

+44

Tenga en cuenta que la semántica de la longitud del carácter no afecta a la longitud máxima de 4000 bytes para un 'VARCHAR2'. Declarar un 'VARCHAR2 (4000 CHAR)' permitirá menos de 4000 caracteres si algunos de los caracteres requieren múltiples bytes de almacenamiento. –

+0

@David Sykes ¿Es esto semánticamente lo mismo con NVARCHAR (11)? – Nap

+0

@Nap No es tan lejos como sé. Creo que el parámetro de tamaño en la declaración de tipo NVARCHAR tiene el mismo 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 comprobado esto. Nunca he usado NVARCHAR. –

19

Uno tiene exactamente el espacio de 11 bytes, la otra durante exactamente 11 caracteres. Algunos conjuntos, 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

3

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

También esos tipos de campo pueden tratarse de manera diferente con respecto a caracteres acentuados o mayúsculas y minúsculas, por ejemplo 'binaryField (ete) = "été"' no coincidirá con 'charField (ete) = "été"' might (again not seguro sobre Oracle).

15

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

  1. campo Límites a 11 BYTE
  2. campo Límites a 11 CHAR teres


Conclusión: 1 carácter no es igual a 1 byte.

Cuestiones relacionadas