¿Cómo obtener tipos numéricos de MySQL usando PDO?

Resuelto victrnava asked hace 54 años • 4 respuestas

Estoy usando PDO y MySQL, por alguna razón, cuando obtengo valores de la base de datos que son de tipo int, PDOStatement devuelve una representación de cadena del número y no un valor de tipo numérico. ¿Cómo evito que esto suceda?

Noté que hay un atributo de la clase PDO: PDO::ATTR_STRINGIFY_FETCHESse supone que se encarga de esto pero, al intentar modificarlo, arroja un error que dice que el atributo no es válido para el controlador MySQL.

¿Es normal obtener cadenas en lugar de números al consultar una base de datos?

victrnava avatar Jan 01 '70 08:01 victrnava
Aceptado

Para responder primero a su última pregunta, "sí", desafortunadamente es normal recibir números como cadenas. Como dice el manual citado por Pascal, mysqlnd (PHP 5.3) devolverá tipos de datos nativos de declaraciones preparadas, siempre que desactive la emulación de declaraciones preparadas desde PDO.

new PDO($dsn, $user, $pass, array(
    PDO::ATTR_EMULATE_PREPARES => false
))

PDO::ATTR_STRINGIFY_FETCHES no está relacionado con MySQL.

Si miras el lado positivo, es una buena práctica usar declaraciones preparadas de todos modos, así que... ;)

Josh Davis avatar Jul 29 '2009 00:07 Josh Davis

No creo que se puedan tener "números" en PHP 5.2 :-(

En PHP 5.3, es posible, si no recuerdo mal, cuando se utiliza el nuevo controlador (nuevo como en PHP >= 5.3) mysql nd (MySQL Native Driver) .

Bueno, después de investigar más en mis marcadores encontré este artículo sobre mysqlnd:PDO_MYSQLND: The new features of PDO_MYSQL in PHP 5.3

Dice esto (cita):

Ventajas de usar mysqlnd para PDO

mysqlnd devuelve tipos de datos nativos cuando se utilizan declaraciones preparadas del lado del servidor; por ejemplo, una columna INT se devuelve como una variable entera, no como una cadena. Eso significa menos conversiones de datos internamente.

Pero esto es solo PHP 5.3 (siempre que su versión de PHP 5.3 esté compilada con mysqlnd ( y no con el antiguo libmysql) ), y parece ser solo el caso para declaraciones preparadas :-(

Lo siento...

Una solución sería tener, en el lado de PHP, un sistema de mapeo (como un ORM - ver Doctrine ; solo como ejemplo de ORM: no sé si hace lo que estás pidiendo) para convertir los resultados viniendo de la base de datos a tipos de datos PHP...

Y sí, esto es malo si quieres usar operadores como ===y !==, que son sensibles al tipo...

Pascal MARTIN avatar Jul 28 '2009 22:07 Pascal MARTIN

La respuesta de Pascal es correcta. Tuve algunos problemas para que todo funcionara. Aquí está lo que tú necesitas hacer.

Primero, asegúrese de tener mysqlnd instalado y activado. Mira a php --info. En la sección pdo_mysql, debería verse así:

pdo_mysql

PDO Driver for MySQL => enabled
Client API version => mysqlnd 5.0.8-dev - 20102224 - $Revision: 321

Si en lugar de ver mysqlnden la versión de Client API, ves una línea como...

Client API version => 5.5.29

...entonces no tienes mysqlnd instalado y funcionando. Ocúpate de eso primero.

En segundo lugar, PDO utiliza declaraciones preparadas emuladas de forma predeterminada para todas las conexiones MySQL . Ridículo, pero ahí está. Y obtendrá tipos de datos nativos solo si utiliza declaraciones preparadas reales (llamadas "declaraciones preparadas del lado del servidor" en la publicación del blog vinculada, que ahora está aquí ). Por lo tanto, debes configurar PDO::ATTR_EMULATE_PREPARES en falso, así:

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

Por último, asegúrese de no haber configurado PDO::ATTR_STRINGIFY_FETCHES en verdadero.

$pdo->setAttribute(PDO::ATTR_STRINGIFY_FETCHES, false);
Alexander Garden avatar Mar 23 '2013 22:03 Alexander Garden