¿Cómo obtener tipos numéricos de MySQL usando PDO?
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_FETCHES
se 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?
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... ;)
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...
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 mysqlnd
en 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);