6
votes

PDO always returns field values as strings when using MySQL. Is PDO consistent when using another database like MSSQL?

If not, is there a flag which forces PDO to always return strings (for purpose of consistency)? or better still to return native types for all values?

From what I can tell, Drupal makes it possible to use different databases using PDO. It performs the necessary conversions to make SQL statements compatible with the varying syntaxes. But how does it deal with data types in query results?

2

2 Answers

2
votes

If you want to make sure that you always get strings you can use bindColumn() and specify the data type for each column

$sql = 'SELECT id, name FROM test';
$stmt = $dbh->query($sql);
/* Bind by column number */
$stmt->bindColumn(1, $id, PDO::PARAM_STR); //or PDO::PARAM_INT
$stmt->bindColumn(2, $name, PDO::PARAM_STR);
while ($row = $stmt->fetch(PDO::FETCH_BOUND)) {
  var_dump($id); var_dump($name);
}
1
votes

In so far as I remember, this depends on the DB engine.

Some time ago, PDO would return a t or f strings for boolean fields in Postgres, and I vaguely recall that it was returning a true or false boolean the last time I used it.

You can normalize results into native types after checking getColumnMeta():

http://us3.php.net/manual/en/pdostatement.getcolumnmeta.php

Doing so comes with a few strings attached, though. The warnings in the php manual are one. The inconsistent values returned from an engine to the next are another:

List of PHP native_type's for PDO getColumnMeta()