【问题标题】:GO and MYSQL: error 1265 data truncated for column at row 1GO 和 MYSQL:第 1 行的列截断错误 1265 数据
【发布时间】:2021-08-28 15:02:06
【问题描述】:

我有一个问题:

我在 GO 中有这个结构:

type Person struc{
   name string
   age int64
}

我想将它保存在一个名为 varchar(255) 和 age int(11) 的 MYSQL 表中

我正在使用 ExecContext 函数,但它返回错误 1265:第 1 行的列“年龄”的数据被截断

如果有人可以帮助我,那就太好了,这是示例,不是真实数据,但实际上是问题所在

【问题讨论】:

  • 编辑问题以显示对 ExecContext 的调用以及两个字段的实际值。
  • 你用的是gorm吗?使用反射的 API 通常不会访问小写字段。
  • Go int64 比 mysql INT 范围更广。您正在尝试存储一个大于 MYSQL 中可能的最大值(或小于最小值)的值。值得怀疑的是,这样的值是否会是一个人的有效年龄,因此您可能在某个地方遇到了一些额外的错误。您是否尝试过打印出您存储的值?
  • LOL - 你用什么时间单位来测量这个人的年龄,皮秒? :-)
  • INT 在 MySQL 中是 32 位的。对于 64 位,您需要 BIGINT 数据类型。一个年龄需要超过 32 位(甚至 8 位,即 -128 到 127)会使您的数据非常可疑。

标签: mysql go


【解决方案1】:

正如@BadZen 所说,此错误警告您,作为 int64 存储在 age 中的值大于 int(11) 允许的最大值(即 2,147,483,647,不管@MatBailie 指出的 int 中的 11 )。这很可能发生,因为 int64 将一个 64 位整数(根据其定义)传递给 MySQL,而正如 cmets 中所说,MySQL int 仅包含 32 位。

与其将年龄类型增加到 BIGINT(年龄不需要它),不如在 Go (int32) 中使用 32 位 int。

使用 Go 提供的 int 数据类型,我相信这将是 32 位系统上的 32 位和 64 位系统上的 64 位。我以前使用它没有遇到任何问题,但为了安全起见,您可以使用 int32 代替 int。

【讨论】:

  • INT(11) 中,11 指定数据类型(填充为11 位) 的打印格式,而不是dta 类型的大小。 INT(3)INT(11) 等都是 32 位的 INT。为了容纳更广泛的 MySQL 使用BIGINTstackoverflow.com/questions/5634104/…
  • @MatBailie 我不知道这一点,非常感谢您的提醒。我会看一下文档,但你介意解释一下打印格式的目的是什么吗?例如,如果我输入一个 12 位数字,它会因为打印格式原因不接受它吗?还是只显示前 11 位数字?我会自己检查一下,但如果你有一个很好的文档链接来解释这一点,我将不胜感激
  • 它最多可以填充 11 个字符,它永远不会截断任何内容。这一切都在我提供的链接中进行了解释,该链接还链接到文档。另外,INT 是 32 位的,范围是-2,147,483,648 to 2,147,483,647,这意味着提供 12 位数字会导致溢出。为此,您需要 BIGINT(64 位)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 2016-09-08
相关资源
最近更新 更多