Maison >base de données >tutoriel mysql >Pourquoi les résultats de mes colonnes numériques PHP MySQL sont-ils parfois des chaînes au lieu d'entiers ou de flottants ?

Pourquoi les résultats de mes colonnes numériques PHP MySQL sont-ils parfois des chaînes au lieu d'entiers ou de flottants ?

DDD
DDDoriginal
2024-12-10 16:18:10920parcourir

Why are my PHP MySQL numeric column results sometimes strings instead of integers or floats?

Renvoi d'entiers et de chiffres en tant que types en PHP à partir de MySQL

Malgré la définition de PDO::ATTR_STRINGIFY_FETCHES sur false, vous pouvez rencontrer des problèmes lorsque les colonnes numériques sont toujours renvoyés sous forme de chaînes au lieu d’entiers ou de chiffres. Ce comportement est souvent attribué à un problème d'implémentation du pilote.

La différence mysqlnd

La clé pour résoudre ce problème réside dans la garantie que vous utilisez mysqlnd pilote pour PHP. Lors de la visualisation de php -i, l'absence de "mysqlnd" dans la section pdo_mysql indique que le pilote natif est utilisé à la place.

Installation de mysqlnd

Sur Ubuntu, installez php5-mysqlnd au lieu de php5-mysql. Pour garantir une transition réussie, suivez ces étapes :

  1. Supprimez l'ancien pilote : apt-get remove php5-mysql
  2. Installez le nouveau pilote : apt-get install php5-mysqlnd
  3. Redémarrer Apache : redémarrage du service Apache2

Vérification mysqlnd

Lors de l'installation de php5-mysqlnd, php -i devrait maintenant mentionner explicitement "mysqlnd" dans la section pdo_mysql.

Paramètres PDO

Définissez les attributs PDO suivants pour garantir des données appropriées gestion :

  • PDO::ATTR_EMULATE_PREPARES : false
  • PDO::ATTR_STRINGIFY_FETCHES : false

Valeurs renvoyées

Avec le pilote et les paramètres corrects, les colonnes numériques seront renvoyés selon les types PHP appropriés :

  • Types à virgule flottante (FLOAT, DOUBLE) : PHP flottants
  • Types entiers (INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT) : PHP entiers
  • Types à virgule fixe (DECIMAL, NUMERIC) : strings
    (Remarque : les BIGINT dépassant un entier signé de 64 bits seront renvoyés sous forme de chaînes sur les systèmes 64 bits.)

Par exemple, les données suivantes :

+-----------+-----------+----------+-------------+--------------+
| integer_col | double_col | float_col | decimal_col | bigint_col    |
+-----------+-----------+----------+-------------+--------------+
| 1          | 1.55      | 1.5      | 1.20        | 18446744073709551615 |
+-----------+-----------+----------+-------------+--------------+

Sera retourné comme :

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