Hola, tenemos la respuesta a lo que necesitas, desplázate y la hallarás más abajo.
Solución:
-
¿Es esta una característica intencional?
Sí, la conversión de tipo implícita es una característica intencional. Hay ventajas y desventajas de cualquier manera, pero así es como Postgres está diseñado para funcionar:
En muchos casos, un usuario no necesita comprender los detalles del mecanismo de conversión de tipo. Sin embargo, las conversiones implícitas realizadas por PostgreSQL pueden afectar los resultados de una consulta. Cuando sea necesario, estos resultados se pueden adaptar mediante conversión de tipo explícita
-
¿Esto no viola la suposición de que los RDBMS deben tener seguridad de tipos?
No, todo sigue siendo seguro y “SQL es un lenguaje fuertemente tipado”. Las conversiones implícitas no cambian eso.
-
¿Hay algo que pueda hacer para evitar moldes de tipo ‘casuales’?
Aparte de jugar con el catálogo del sistema, que suele ser una muy mala idea (e imposible en algunos casos), no hay mucho que pueda hacer para evitar por completo la conversión implícita. Incluso si incluye conversiones explícitas en todas partes, las conversiones implícitas pueden ocurrir por error:
create table t(foo text); insert into t(foo) values(11::integer);
select * from t;
| foo | | :-- | | 11 |
dbfiddle aquí
Lo que dijo @Jack.
Además, para ser precisos, el elenco de tu INSERT
es “implícito” en un sentido común:
insert into d values ( 42 );
pero es un asignación yeso, no un implícito fundido en la terminología de Postgres. Esa es una diferencia importante, las conversiones implícitas tienen muchas más aplicaciones. Ver:
- Generar series de fechas – usando el tipo de fecha como entrada
Asignación o implícito los lanzamientos solo ocurren en base a…
1. Una entrada en el catálogo del sistema pg_cast
con castcontext = 'a'
o castcontext = 'i'
respectivamente.
La lista completa para su instalación actual:
SELECT casttarget::regtype AS target_type
, castsource::regtype AS source_type
, castcontext
FROM pg_cast
WHERE castcontext IN ('i', 'a')
ORDER BY 1, 2;
2. Reglas genéricas adicionales
El manual:
se debe notar que
pg_cast
no representa todas las conversiones de tipo que el sistema sabe cómo realizar; sólo aquellos que no pueden deducirse de alguna regla genérica. Por ejemplo, la conversión entre un dominio y su tipo base no se representa explícitamente enpg_cast
. Otra excepción importante es que “conversiones de conversión de E/S automáticas”, las que se realizan utilizando las funciones de E/S propias de un tipo de datos para convertir hacia o desdetext
u otro string tiposno están representados explícitamente enpg_cast
.
Énfasis en negrita mío.
En teoría, podría meterse con las entradas en pg_cast
(1.) cambiando 'i'
o 'a'
para 'e'
(“explícito”), que puede tener consecuencias de gran alcance y es una mala idea a menos que sepa exactamente lo que está haciendo; pero no con el resto (2.).
Relacionada:
- cambiando float-> moldes numéricos de asignación a implícito, ¿peligroso?
- Análisis de PostgreSQL string literal como registro antes de llamar al elenco
Repartos de unknown
Citando el manual sobre “Constantes” una vez más:
Hay tres tipos de tipificado implícitamente constantes en PostgreSQL: cadenas, cadenas de bits y números. Las constantes también se pueden especificar con tipos explícitos, lo que puede permitir una representación más precisa y un manejo más eficiente por parte del sistema.
Más detalles en ese capítulo.
unknown
Los literales de tipo son cadenas y se pueden convertir utilizando las “conversiones automáticas de conversión de E/S” mencionadas anteriormente. Pero Postgres necesita determinar el tipo de destino antes de encontrar un molde apropiado. En la asignación simple, el tipo de objetivo es obvio. En otros casos, determinar el tipo de destino puede ser complicado. Hay extensos cuerpos de reglas en:
- Resolución de tipo de operador
- Tipo de función Resolución
Si piensas que ha sido útil nuestro post, sería de mucha ayuda si lo compartieras con más desarrolladores así contrubuyes a difundir este contenido.