Es lo mismo definir un tipo de varchar2 (10) o varchar2 (1000).
No, no es lo mismo en absoluto.
- La longitud de la columna es un metadato útil para desarrolladores que crean pantallas.
- De manera similar, las herramientas de consulta automática como TOAD y SQL Developer usan la longitud de la columna cuando muestran los resultados.
- La base de datos usa la longitud de una variable al asignar memoria para colecciones PL/SQL. A medida que esa memoria sale de la superposición de PGA, la declaración de variables puede provocar errores en los programas porque el servidor se ha quedado sin memoria.
- Existen problemas similares con la declaración de variables individuales en programas PL/SQL, es solo que las colecciones tienden a multiplicar el problema.
- Las columnas extragrandes crean problemas para los índices compuestos. A continuación se presenta en una base de datos con 8K bloques
....
SQL> create table t23 (col1 varchar2(4000), col2 varchar2(4000))
2/
Table created.
SQL> create index t23_i on t23(col1,col2)
2/
create index t23_i on t23(col1,col2)
*
ERROR at line 1:
ORA-01450: maximum key length (6398) exceeded
SQL>
Pero por encima de todo, columnas tamaños son una forma de comprobación de errores. Si se supone que la columna tiene diez caracteres de longitud y algún proceso autónomo está tratando de cargar mil caracteres, entonces algo está mal. El proceso debería fallar, por lo que podemos investigar por qué estamos cargando datos duff. La alternativa es una base de datos llena de basura, y si eso es lo que queríamos deberíamos haberle dado a todos Excel y haberlo hecho.
Es cierto que cambiar el tamaño de la columna cuando resulta que hemos subestimado puede ser fastidioso. Pero no ocurre muy a menudo, y podemos mitigar mucho el dolor utilizando declaraciones% TYPE y SUBTYPE en nuestro PL/SQL en lugar de longitudes variables de codificación dura.
"¿por qué hay tal declaración en el tipo de número"
números son diferentes. Para empezar, el tamaño máximo de un número es mucho menor que el texto equivalente (38 dígitos de precisión garantizada).
Pero la diferencia clave es que Oracle almacena los valores numéricos in scientific notation, por lo que no existe una relación directa entre el tamaño aritmético del número y el espacio de almacenamiento que consume.
SQL> select vsize(123456789) n1
2 , vsize(999999999999999999999999999999) n2
3 , vsize(0.000000000000000000001) n3
4 , vsize(1000000000000000000000000) n4
5 from dual
6/
N1 N2 N3 N4
---------- ---------- ---------- ----------
12 16 2 2
SQL>
Sin embargo, sigue siendo buena práctica especificar la escala y precisión siempre que sea posible, especialmente cuando se trata de números enteros, por ejemplo, o dinero.
No estoy contento con la forma en que se formó la pregunta. En última instancia, Oracle 9 o la placa de estándares SQL) deciden cómo funcionan estas cosas y como desarrolladores trabajamos dentro de ellas. Discutir por qué está un poco fuera de tema. Dicho esto, si la pregunta era "¿Por qué no debería hacer todos mis VARCHAR2 4000 bytes para evitar que los problemas de la columna sean demasiado pequeños? Sería una pregunta más práctica y las respuestas serían similares. –
@damian, ¿qué problemas hay? ¿Has cambiado el tamaño a tamaños más grandes? –
@Gary Tienes razón, pero ¿por qué no criticar también el estándar de Oracle? Soy consciente de que es una especie de pregunta de tipo de movimiento nosql @Jeffrey, no, pero es una solución predecible y molesta. cuando la aplicación cliente necesita escalar – user2427