【问题标题】:What is the max size of type "SQLITE3_INTEGER"?“SQLITE3_INTEGER”类型的最大大小是多少?
【发布时间】:2019-03-12 08:15:27
【问题描述】:

https://www.sqlite.org/datatype3.html 中所述:

INTEGER:该值是有符号整数,存储在 1、2、3、4、6 或 8 中 字节数取决于值的大小。

问题是下面的语句给出了想要的结果,因为 bound 值相对较小(例如,$roll_no = 1111111111),但是,语句的执行当绑定值较大时(例如,$roll_no =3333333333)不获取任何结果,而 SQLite 表已经保存了具有该较大值的记录。

是因为参数值被截断还是其他原因?怎样才能摆脱它?

$stmt1 = $db->prepare("select sname,reg_no from student where roll_no=:roll_no");

$stmt1->bindParam(':roll_no', $roll_no, SQLITE3_INTEGER);

【问题讨论】:

  • 你的PHP_INT_MAX是什么?
  • 可能是 2147483647,因为我使用的是 32 位系统,是否可以将其更改为无符号,如果可以,更改会解决我的问题吗?
  • PHP 只支持有符号整数。所以,没有。
  • 感谢您的回复。那么在不改变数据库中数据类型的情况下改成SQLITE3_TEXT好不好?

标签: php sqlite


【解决方案1】:

查看PHP的PDO驱动:
https://github.com/php/php-src/search?q=SQLITE_INTEGER&unscoped_q=SQLITE_INTEGER

#if LONG_MAX <= 2147483647
            if (val > ZEND_LONG_MAX || val < ZEND_LONG_MIN) {
                ZVAL_STRINGL(data, (char *)sqlite3_column_text(stmt, column), sqlite3_column_bytes(stmt, column));

它支持返回更大的整数,但只能作为字符串。

在 PHP 端(32 位版本)上无法将 3333333333 作为本机整数。这样它甚至在到达 SQLite 之前就变成了一个浮点数。

您应该做的不是尝试将其绑定为整数。使用字符串。 SQL 会自己进行类型转换。您甚至可以将 SQLites 上的列保持为 INTEGER 结束。您必须解决的只是 PHP。或者你知道,做过期的升级。

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 2013-02-26
    • 2012-06-30
    • 2011-03-13
    • 1970-01-01
    • 2011-08-31
    • 2012-11-10
    • 2011-02-28
    相关资源
    最近更新 更多