为什么在PHP中使用sqlite3 fetchAll(PDO:FETCH_ASSOC)将所有数据类型作为字符串返回


Why are all data types returned as strings with sqlite3 fetchAll(PDO:FETCH_ASSOC) with PHP?

我正在使用

$rows = $statement->fetchAll(PDO::FETCH_ASSOC);

把我桌子上的每一排都占满。

该模式被定义为"id INTEGER PRIMARY KEY,title TEXT,year INTEGER,price REAL"

fetchAll结果中的一行为

array(4) {
    [0]=>
    string(1) "1"
    [1]=>
    string(14) "The Dark Night"
    [2]=>
    string(4) "2008"
    [3]=>
    string(5) "19.95"
  }

为什么所有的数据类型都以字符串的形式返回?我希望它们按照模式中的定义返回。我理解SQLite的"无类型"性质,但它们确实将有限的数据类型定义为TEXT、INTEGER和REAL。如何获取要使用指定数据类型返回的数据?我不想迭代每一行,并用PHP进行转换——这似乎太慢了。

完整的测试代码如下:

<?
class sqlite_test {
    function __construct()
    {
        $this->dbase_filename = "test.sqlite";
        $this->init_dbase();
    }
    function init_dbase()
    {
        $this->pdo = new PDO("sqlite:".$this->dbase_filename);
    }
    function open_table()
    {
        $table = "dvds";
        if ( ! ($test_to_see_if_table_exists = $this->pdo->query("SELECT 1 from $table")) ) {
            $schema = "id INTEGER PRIMARY KEY, title TEXT, year INTEGER, price REAL";
            $query = "CREATE TABLE $table ($schema)";
            $this->pdo->exec($query);
        }
        return $test_to_see_if_table_exists;
    }
    function add_test_records()
    {
        $query[]='INSERT INTO dvds (id, title, year, price) VALUES (null, "The Dark Night", 2008, 19.95)';
        $query[]='INSERT INTO dvds (id, title, year, price) VALUES (null, "The Wizard of Oz", 1939, 9.95)';
        $query[]='INSERT INTO dvds (id, title, year, price) VALUES (null, "Jaws", 1977, 6.95)';
        $this->pdo->exec( join(';', $query) );
    }
    function dump_test_records()
    {
        $query = "SELECT * FROM dvds";
        if ($statement = $this->pdo->prepare($query)) {
            $statement->execute();
            $rows = $statement->fetchAll(PDO::FETCH_ASSOC);
            echo "<pre>";
            var_dump($rows);
            echo "</pre>";
        }
    }
    function main()
    {
        if ( ! $this->open_table() ) {
            $this->add_test_records();
        }
        $this->dump_test_records();
    }
}
$test = new sqlite_test();
$test->main();

这与SQLite无关;无论您使用什么查询数据库,所有记录都将作为字符串集合返回。这只是PHP使用的数据库适配器/驱动程序的特性。

如果您希望值是您所需的类型,则必须手动强制转换。

PHP 8.1开始为INTEGER字段(sqlite pdo)返回数字而不是字符串。