【问题标题】:c++ usigned long long range vs mysql unsigned bigint rangec++ unsigned long long range vs mysql unsigned bigint range
【发布时间】:2015-08-22 13:19:30
【问题描述】:

我有一个返回 unsigned long long 值的 MySQL UDF。当我在 MySQL 中调用此函数并且数据已保存在数据库中时,MySQL 返回警告:
BIGINT UNSIGNED 值超出范围”。
如何在数据库中保存大的无符号长长数字?

MySQL 版本:5.5.43
操作系统:Ubuntu 14.04

请帮忙。

【问题讨论】:

  • 你的列定义是什么? bigint 是 8 个字节,而 unsigned long long(通常)也是 8 个字节。它应该适合。此外,这将有助于向我们展示代码以及错误发生的确切位置。

标签: c++ mysql bigint unsigned-long-long-int udf


【解决方案1】:

假设您的 unsigned long long 数据类型是 64 位,它应该非常适合 MySQL BIGINT UNSIGNED 类型,它也是 64 位。

我建议检查您的 C 实现 limits.h(或 climits 对于 C++)文件中的宏 ULONG_MAX,以确保它只有 64 位。


但是,您应该知道,您可以对无符号值执行某些操作,这些操作也会给您带来此错误。如果您只是存储从 UDF 返回的确切值,则它可能不适用,但是,如果您正在执行以下操作:

select my_udf() - 22 from somewhere

my_udf() 返回15(例如),您将看到该错误消息,因为-7 不能以无符号类型表示。

如果是这种情况,解决方案可能就像将返回值转换为有符号类型一样简单,但我们需要更多关于它可以返回什么的信息才能正确建议。

【讨论】:

  • 感谢 paxdiablo 的回复。我发现当我在 MySQL 中创建 UDF 并将返回类型设置为 INTEGER 时,MySQL 将这种类型视为“long long”而不是“unsigned long long”,这是问题。我该如何解决这个问题?
  • @Ghasem,从文档中,看来你只能做整数、实数和字符串。您可能必须将值作为字符串返回(例如在 C 代码中使用 sprintf)并在 SQL 中将其强制转换为正确的类型。
  • 我使用将返回值转换为无符号类型,这解决了我的问题。谢谢paxdiablo :)
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 2012-05-24
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 2012-01-27
  • 1970-01-01
相关资源
最近更新 更多