L'exécution de type cast fonctions postgresql 9.1.3 n'est pas la même que dans postgresql 8.2.22. Concaténation ne fonctionne pas correctement
J'ai été en utilisant la version de postgresql 8.2.22, puis j'ai mis à niveau vers postgresql 9.1.3 et la mise à jour a été effectuée avec succès.
Mais maintenant, certaines distributions ne sont pas le même comme avant!
Dans Postgres 8.2.22
J'exécute ces deux requêtes et ils fonctionnent correctement:
POSTGRES8222=# select TO_NUMBER('12345678',9999999999.99);
to_number
=========
12345678
(1 row)
POSTGRES8222=# select a ||'$'|| b from test;
?column?
----------
1$abcdef
2$ghijkl
3$3456
(3 rows)
Après la mise à Postgres 9.1.3
- Je exécuter les mêmes requêtes et maintenant ils jettent des erreurs:
select TO_NUMBER('12345678',9999999999.99);
ERROR: function to_number(unknown, numeric) does not exist
LINE 1: select TO_NUMBER('12345678',9999999999.99);
^
HINT: No function matches the given name and argument types. You might
need to add explicit type casts.
EXCEPTION
org.postgresql.util.PSQLException: ERROR: function to_number(numeric, numeric)
does not exist
Hint: No function matches the given name and argument types. You might need
to add explicit type casts.
Position: 150
select a ||'$'|| b from test;
ERROR: operator is not unique: numeric || unknown
LINE 1: select a ||'$'|| b from test;
^
HINT: Could not choose a best candidate operator. You might need to
add explicit type casts.
********** Error **********
ERROR: operator is not unique: numeric || unknown
SQL state: 42725
Hint: Could not choose a best candidate operator. You might need to
add explicit type casts.
Character: 10
Pourquoi est-ce que la coulée dans postgresql ne fonctionne pas comme il le faisait avant?
OriginalL'auteur RSK | 2012-08-17
Vous devez vous connecter pour publier un commentaire.
Début avec PostgreSQL 8.3, il y a moins automatique jette. Ce qui a changé pour deux raisons:
De nombreux nouveaux haut-alimenté types ont été introduites et automatique de moulage empêché ces d'être en mesure d'utiliser les littéraux d'une manière qui "première classe" des types. Rétrécissement le cas où l'analyseur essayé de deviner le type de données permet de développer de nouveaux types que l'utilisateur peut brancher à être utilisé dans une manière plus naturelle.
De nombreux rapports de bug s'est avéré être les gens accidentellement obtenir l ' "avantage" d'automatique de moulage, quand ils n'avaient pas reconnaître que c'était le cas, ce qui rend difficile de trouver leur application à des erreurs de codage. Après 8.3 a été publiée, il y avait à peu près le même nombre de gens de poster pour dire que le changement découvert caché bugs dans leur propre code comme il y avait des gens qui se plaignent que leur code maintenant nécessaire jette où il a précédemment n'ont pas.
Il semble que vous avez essayé de résoudre ce "problème" en ajoutant implicite typecasts. C'est un champ de mines; je ne le recommande pas. Pour limiter les fonctionnalités que vous pouvez utiliser en toute sécurité et vous aurez pas de fin de bizarres petits bugs que personne d'autre ne le fait, et personne ne peut facilement vous aider avec. Il est préférable de fixer votre code de ne pas assumer donc beaucoup de conversions implicites.
Une chose qui peut être déroutant vous, c'est que dans PostgreSQL,
'1.2'
est pas un littéral de chaîne. C'est un littéral de inconnu type:PostgreSQL est titulaire d'arrêt sur la résolution du type de littéral tant qu'il peut, qui fonctionne très bien avec tous ces nouveaux types de données que je décrivais. En dernier recours, si le temps vient quand il a à résoudre le type et il n'y a pas d'autres indices, il le traite comme type
text
.Problème 2, "aftertypecast", est un échec parce que avec tous les types implicites jette que vous avez ajouté, il n'y a plus d'un opérateur || ce qui pourrait être choisie en fonction de qui implicite typecasts il a effectué, et il n'y avait pas moyen de principes de choisir entre eux. Si vous modifiez cette ligne à la suivante, il devrait fonctionner à nouveau:
Je suis en expliquant qu'il serait plus propre et plus sûr de ne pas ajouter ces conversions implicites et de modifier le premier problème de code à partir de:
:
Après tout, que le deuxième paramètre est un chaîne de format, pas un numéro. Vous ne pouvez pas omettre les citer si vous voulez faire quelque chose comme:
OriginalL'auteur kgrittn