¿SQLite sería menos útil sin aceptar inserciones de valores no numéricos en columnas numéricas?

10

En SQLite, la siguiente instrucción sería exitosa y la cadena se insertaría / actualizaría en la SALARYcolumna que es de tipo INTEGER:

update employee set salary='TOO MUCH' where emp_id=1;

Tenga en cuenta que no se insertará / actualizará cero, sino la cadena "DEMASIADO" real , por lo que no se trata de la conversión de tipo automática.

Las preguntas frecuentes dicen:

Esta es una característica , no un error. SQLite utiliza la tipificación dinámica. No aplica restricciones de tipo de datos. Los datos de cualquier tipo pueden (generalmente) insertarse en cualquier columna. Puede colocar cadenas de longitud arbitrarias en columnas enteras, números de coma flotante en columnas booleanas o fechas en columnas de caracteres. El tipo de datos que asigna a una columna en el comando CREATE TABLE no restringe qué datos se pueden poner en esa columna. Cada columna puede contener una cadena de longitud arbitraria. (Hay una excepción: las columnas de tipo INTEGER PRIMARY KEY solo pueden contener un entero con signo de 64 bits. Se producirá un error si intenta colocar algo distinto de un entero en una columna INTEGER PRIMARY KEY).

Por lo tanto, este comportamiento es claramente intencional, sin embargo, me pregunto por qué SQLite tiene este comportamiento, ya que la mayoría de las otras bases de datos SQL que conozco se comportan de manera muy diferente, generarían un error o convertirían la cadena 0 al intentar insertar una cadena no numérica en Una columna numérica.

  • ¿La biblioteca SQLite sería menos útil sin este comportamiento?

  • ¿Está hecho así por diseño para mantener la biblioteca pequeña y rápida?

  • ¿La biblioteca SQLite sería significativamente más lenta o más grande para generar errores al intentar insertar una cadena en una columna numérica?

Tulains Córdova
fuente
99
Alguien dijo una vez que "una característica es un error como lo describe el departamento de marketing".
Dan Pichelman el
3
Dudo que sea bueno para el rendimiento y la densidad de datos, aunque podría ser beneficioso para el tamaño del código. Con todo, yo lo llamaría un error intencional (o al menos adoptado).
Deduplicador
3
"Me parece una limitación impuesta para seguir siendo una biblioteca de pequeño tamaño y bajos recursos que generalmente se usa para sistemas integrados que requieren un rendimiento en tiempo real ..." No puedo imaginar que una verificación de tipo sea algo más que una caída el segmento de rendimiento de tiempo / espacio para operaciones que realizan cualquier cantidad de E / S de disco. También tienen que tener verificaciones adicionales en el código, ya que no pueden simplemente asumir que los datos tendrán un tamaño fijo, por lo que podría decirse que la escritura dinámica le cuesta el rendimiento.
Doval
1
@DocBrown No porque yo lo diga, sino porque es sui generis .
Tulains Córdova
2
@ user61852 Le sugiero que reescriba la pregunta por completo y se concentre en si la escritura dinámica de SQLite le otorgará beneficios de rendimiento, y omita cualquier mención de la distinción característica / error o la utilidad / inutilidad general de la escritura dinámica en el contexto X o Y.
Doval

Respuestas:

8

No, la escritura dinámica requiere más espacio de almacenamiento y más tiempo de procesamiento, especialmente porque también agregan afinidad de tipo, lo que significa que tiene un tipo preferido que el programador puede ignorar. Es realmente una característica intencional con costos reales de compensación. Esos costos son efectivamente insignificantes para los casos de uso de los objetivos SQLite, pero todavía están allí.

La utilidad de tales características es difícil de ver porque no está acostumbrado a tenerla disponible para usted. La solución para su falta se siente más natural para usted ahora. Debido a su experiencia previa, está pensando en él como un campo INTEGER que nunca será otra cosa, pero SQLite lo ve más como un campo de cualquier tipo, pero probablemente contendrá principalmente enteros. Quizás es un código postal para una empresa que principalmente hace negocios en los Estados Unidos, pero que tiene un puñado de clientes canadienses. Permitir que el usuario especifique una afinidad entera ahorrará mucho espacio al convertirlo en una cadena en cada fila, pero aún así le brinda esa opción.

Karl Bielefeldt
fuente
3
Escribí una actualización de mi pregunta sobre el almacenamiento exitoso de la cadena "DEMASIADO" en una columna numérica. La conversión automática insertaría cero. Además, esta es la primera implementación de base de datos relacional que sé que permitiría eso. He trabajado con MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL y Sybase SQL Anywhere.
Tulains Córdova
2
No entiendo tu comentario. Nada de mi respuesta tuvo nada que ver con la conversión automática.
Karl Bielefeldt
1
SQLite los considera clases de almacenamiento en lugar de tipos de datos. sqlite.org/datatype3.html
JeffO
1
Votó por haber sido escrito claramente, pero está ignorando los problemas que esto causa al probar la precisión de los datos. No puede extraer algunos enteros de su base de datos y asumir que serán enteros. ("La escritura dinámica" está totalmente en desacuerdo con el modelo relacional real en sí .)
Comodín el
1
Los costos de ignorar completamente la escritura son mucho más altos que un poco de espacio de almacenamiento y tiempo de procesador.
DeadMG