3 votes

Types standards PHP et PostgreSQL dans le résultat de la requête. Pourquoi est-ce toujours des chaînes de caractères ?

Utilisation de la norme php5-pgsql il me semble que, au moins avec les paramètres par défaut de php sur ubuntu 10.04, les valeurs de résultat ne sont pas mises en correspondance avec les types standard de php. C'est-à-dire que

  • postresql::integer => php::int
  • postresql::real => php::float
  • etc.

Et renvoyer les valeurs de résultat en les transformant en chaînes de caractères. Cela crée parfois beaucoup de maux de tête lorsque la locale du système ne coïncide pas avec la locale de la base de données, etc.

Est-il possible d'obtenir le casting approprié en php ? Si ce n'est pas le cas, toute explication serait la bienvenue !

EDIT :

Le PDO a résolu le problème "postresql::integer=>php::int", mais pas pour ex. "postresql::real=>php::float" il semble à cause de cela que PDO utilise les pilotes natifs qui est pgsql comme je comprends. La question de l'encodage n'est pas un problème dans mon cas, le seul besoin est de mapper les types exactement ou au moins aussi proche que possible !

$sql = 'SELECT integer_field, numeric_field_10_2 FROM table';
foreach ($dbh->query($sql) as $row) {
    var_dump($row);
}
----------------------------------------
array(4) {
  ["integer_field"]=>int(79)
  ["numeric_field_10_2"]=>string(6) "100.12"
}

Merci, je.

3voto

Mike Buland Points 621

C'est un problème hérité de l'API C et du protocole client postgres. Les résultats sont fournis sous forme de chaînes de caractères dans la bibliothèque backend. Cela ne devrait pas être un problème avec des encodages compatibles, mais vous avez raison, cela peut être un problème.

Vous pouvez utiliser un encodage manuel, ou faire confiance aux automatismes de php, mais le vrai problème est de configurer correctement l'encodage. Vous pouvez définir l'encodage de postgres sur une base par base de données ou par cluster, je recommande personnellement d'utiliser UTF-8.

La conversion d'une base de données existante est assez compliquée, elle implique généralement un vidage complet et une importation complète dans une nouvelle base de données.

pg_client_encoding vous indiquera l'encodage postgres actuel, mais ne vous aidera pas pour l'encodage php. Si vous ne pouvez pas utiliser un encodage compatible, il serait peut-être utile de créer un wrapper qui utilise iconv pour convertir les données de la chaîne.

Enfin, vous pouvez utiliser une autre bibliothèque client. Je pense que la bibliothèque PDO postgres pour php gère mieux ce problème.

http://us.php.net/manual/en/book.pdo.php

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X