Maison  >  Article  >  développement back-end  >  Pourquoi les colonnes numériques MySQL sont-elles renvoyées sous forme de chaînes en PHP et comment puis-je m'assurer qu'elles sont renvoyées sous forme d'entiers ou de nombres flottants ?

Pourquoi les colonnes numériques MySQL sont-elles renvoyées sous forme de chaînes en PHP et comment puis-je m'assurer qu'elles sont renvoyées sous forme d'entiers ou de nombres flottants ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-24 11:21:14507parcourir

Why are MySQL numeric columns returned as strings in PHP, and how can I ensure they are returned as integers or floats?

Comment renvoyer des colonnes entières et numériques à partir de MySQL sous forme d'entiers et de valeurs numériques PHP

Énoncé du problème

Certaines applications basées sur PHP peuvent rencontrer un problème où les résultats des requêtes MySQL sont renvoyés sous forme de chaînes plutôt que sous forme de types de données entiers ou numériques corrects. Cela se produit malgré la définition de l'attribut PDO PDO::ATTR_STRINGIFY_FETCHES sur false pour empêcher la conversion de chaînes.

Considérations sur le pilote

Il est crucial de noter que le pilote MySQL joue un rôle important pour déterminer si les types numériques sont renvoyé sous forme d'entiers ou de chiffres. Certains pilotes, tels que le pilote natif MySQL sous Linux, ne prennent pas entièrement en charge cette fonctionnalité.

Cependant, le pilote mysqlnd, qui est disponible pour les distributions Linux via des référentiels tiers, ne le fait pas. prendre en charge cette capacité. S'assurer que le pilote mysqlnd est utilisé dans votre environnement PHP est essentiel.

Installer le pilote mysqlnd sur Ubuntu

Pour passer du pilote MySQL natif à mysqlnd sur Ubuntu, suivez ces étapes :

  1. Désinstallez le pilote natif : apt-get Remove php5-mysql
  2. Installez le pilote mysqlnd : apt-get install php5-mysqlnd
  3. Redémarrez Apache : service apache2 restart

Vérification du pilote Utilisation

Après avoir installé mysqlnd, confirmez qu'il est utilisé en exécutant php -je. Recherchez l'entrée suivante dans la section pdo_mysql :

PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.10 - 20111026 - $Id: e707c415db32080b3752b232487a435ee0372157 $

Paramètres PDO

Assurez-vous que les attributs PDO suivants sont correctement définis :

  • PDO::ATTR_STRINGIFY_FETCHES : Défini sur false pour empêcher la chaîne casting.
  • PDO::ATTR_EMULATE_PREPARES : défini sur false pour améliorer les performances.

Types de valeurs renvoyées

Une fois ces paramètres configurés, MySQL renverra les types numériques comme suit :

  • Types à virgule flottante (FLOAT, DOUBLE) comme PHP floats
  • Types entiers (INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT) sous forme d'entiers PHP
  • Types à virgule fixe (DECIMAL, NUMERIC) sous forme de chaînes (les bigints avec des valeurs dépassant 64 bits peuvent renvoie également sous forme de chaînes)

Par exemple, le code PHP suivant affichera les types de données attendus :

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$stmt = $pdo->prepare("SELECT * FROM table");
$stmt->execute();

$row = $stmt->fetch(PDO::FETCH_OBJ);

echo "<pre class="brush:php;toolbar:false">";
print_r($row);
echo "
";

Sortie :

object(stdClass)[915]
  public 'integer_col' => int 1
  public 'double_col' => float 1.55
  public 'float_col' => float 1.5
  public 'decimal_col' => string '1.20' (length=4)
  public 'bigint_col' => string '18446744073709551615' (length=20)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn