gpt4 book ai didi

mysql - 有什么方法可以检索高于 2147483647 的 sql int 字段的原始输入吗?

转载 作者:行者123 更新时间:2023-12-01 00:40:38 24 4
gpt4 key购买 nike

我有一个大表,它根据来自外部 API 的输入使用 ID 保存数据。 ID 存储在一个 int 字段中。我在开发系统的时候没有遇到任何问题,因为外部API中记录的ID一直在2147483647以下。

过去几个月系统一直在从 API 获取数据,显然 ID 超过了 2147483647 标记。我现在有一个数据库,其中包含数千条 ID 为 2147483647 的不可用记录。

不可能再次从数据库中获取此信息(基本上,API 允许我们查找最多 x 天前的数据)。

我很确定我注定要失败。但是是否可能有任何积压或任何其他方式来检索原始输入查询,或被 MySQL 截断以适合 int 字段的数字?

最佳答案

正如评论中已经讨论的那样,无法从表中检索信息。它被默默地(?!!!)截断为 32 位。

首先,调用 API 提供商,说明您的情况,然后看看是否可以重做查询。最好的情况是他们说是,您不必尝试从日志中重建内容。最糟糕的情况是他们拒绝了,而您又回到了现在的状态。

然后我会检查一些日志。

首先是 MySQL General Query Log .如果您打开了它,它可能包含运行的查询。另一种可能性是 Slow Query Log ,如果您的查询碰巧很慢,则更经常启用。

在MySQL中,数据截断默认是一个警告。这些警告有可能进入日志并包含原始数据。 MySQL Error Log是一种可能。在 Windows 上,它可能进入了 Windows Event Log。 .在 Mac 上,它可能位于 Console 可见的日志中.在 Unix 中,它可能转到了 syslog。 .

那么 API 查询本身可能会记录在某处。如果您使用代理,它可能会在其日志中包含它们。从 API 获取并添加到数据库的程序也可能有自己的日志。这是一个远景。

作为最后的手段,尝试 grep 所有 /var/log/var/local/log 以及您认为可能包含日志的任何其他地方。


将来您可以采取一些措施来防止此类事情再次发生。最重要的是打开strict SQL mode 。这会将警告(例如数据已被截断)转变为错误。

Set UNIQUE constraints on unique columns .如果您的 API ID 列被声明为 UNIQUE,就会检测到错误。

对数字 ID 使用 UNSIGNED BIGINT。 20 亿是一个很容易超过的数字。这将意味着每行 4 个额外字节或大约 8 GB 额外存储 20 亿行。磁盘很便宜。

考虑开启 ANSI SQL mode .这将禁用大量 MySQL 扩展并使您的 SQL 更具可移植性。

最后,考虑切换到 PostgreSQL .多年来,MySQL 积累了很多糟糕的想法、功能的大杂烩和糟糕的默认行为。你只是一点一点地。 PostgreSQL 的设计要好得多,功能更强大,更灵活,而且速度通常一样快。

在 Postgres 中,你会得到一个错误。

test=# CREATE TABLE foo ( id INTEGER );
CREATE TABLE
test=# INSERT INTO foo (id) VALUES (2147483648);
ERROR: integer out of range

关于mysql - 有什么方法可以检索高于 2147483647 的 sql int 字段的原始输入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33468695/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com