【问题标题】:PostgreSql: Disable Numeric value out of rangePostgreSql:禁用超出范围的数值
【发布时间】:2014-06-06 21:04:59
【问题描述】:

我正在使用 PHP 和 PostgreSQL 创建一个 API。 这是我使用的查询之一:

SELECT id,  email,  first_name,  last_name, [...] FROM clients WHERE id = ?

“id”列是一个整数,我不需要更大的类型。 ?替换为来自用户的值。

但是如果用户发送了一个太大的整数(9999999999999)PostgreSQL 会返回一个错误:

SQLSTATE[22003]:数值超出范围:7 错误:值 \"99999999999999999999999\" 超出了整数类型的范围

我应该检查 PHP 逻辑中的溢出吗?

我可以把这个错误变成警告吗? MySQL 上的相同查询不会失败...

谢谢

【问题讨论】:

    标签: php sql postgresql


    【解决方案1】:

    “MySQL 上的相同查询不会失败”不是一个很好的建议(除非您在 ANSI STRICT 模式下运行 MySQL)。 MySQL 接受 0000-00-00 作为日期,将无效条目强制为空值等,并且通常最多会发出警告,告诉您它已损坏您的数据。

    也就是说,我希望 PostgreSQL 提供返回错误代码/返回 null 的类型转换函数版本,所以我可以明确地写:

    INSERT INTO mytable(blah) VALUES (bigint_in_nullifinvalid('99999999999999999'));
    

    但事实并非如此。

    您可以在 PL/PgSQL 中编写这样的函数,但效率不高,而且没有内置函数。

    虽然我很高兴 PostgreSQL 不会在没有被要求的情况下破坏我的数据,但有时我更希望它在我要求的情况下破坏我的数据。

    一般来说最好:

    • 首先在应用端进行验证;
    • 让数据库强制执行完整性;和
    • 捕获错误并将其报告给用户。您可以匹配 SQLSTATE 返回以了解有关错误的详细信息。

    PostgreSQL 没有任何“插入无效数据并发出警告”选项。

    【讨论】:

    • 好的,我会添加一个if语句来检查“整数类型”的溢出。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 2011-08-02
    • 2022-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    相关资源
    最近更新 更多