PostgreSql:禁用数值超出范围

时间:2014-06-06 12:53:07

标签: php sql postgresql

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

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

专栏" id"是一个整数,我不需要更大的类型。 ?由来自用户的值替换。

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

  

SQLSTATE [22003]:数值超出范围:7 ERROR:value   \" 99999999999999999999999 \"超出类型整数的范围

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

我可以将此错误转为警告吗? 关于MySQL的相同查询不会失败......

谢谢

1 个答案:

答案 0 :(得分:3)

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

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

INSERT INTO mytable(blah) VALUES (bigint_in_nullifinvalid('99999999999999999'));
但是,它没有。

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

虽然我很高兴PostgreSQL不会在没有被要求的情况下破坏我的数据,但有些时候我更愿意在我提出请求时将其破坏我的数据。

一般情况下,最好:

  • 首先在应用程序方面验证;
  • 让数据库强制执行;和
  • 陷阱错误并将其报告给用户。您可以匹配SQLSTATE返回以查找有关错误的详细信息。

PostgreSQL没有任何“插入带警告的无效数据”选项。