【问题标题】:#1265 - Data truncated for column MYSQL 5.7#1265 - MYSQL 5.7 列的数据被截断
【发布时间】:2016-09-13 15:38:09
【问题描述】:

在我将服务器升级到 PHP7 和 MySQL 5.7 后,此查询出现错误:

UPDATE user SET user_rank_points = (@i := (@i + 1))

错误是:#1265 - 第 1 行的“user_rank_points”列的数据被截断

有人有解决办法吗?

【问题讨论】:

  • 那么该字段的类型/定义是什么?
  • 名称类型归类属性 Null 默认 user_rank_points smallint(5) 否 0
  • smallint 是 16 位的。基本上是 +/- 32767 范围或 0-65535。你的@i 可能溢出了。
  • @i 在哪里初始化?
  • SET @i=0 表也只有 140 行

标签: mysql


【解决方案1】:

随着人们升级到 MySQL 5.7,这类问题会出现很多。这个版本的 MySQL 将严格的 SQL 模式作为默认设置,这与早期版本的严格模式不同。

如果没有严格模式,当您尝试将 32768 之类的值存储到 SMALLINT 中时,它会默默地将该值截断为 32767,这是您可以存储在有符号 16 位中的最大值整数。

您是否希望 MySQL 更改您尝试存储的数据?如果是这样,您可以更改 sql_mode 以删除严格模式,所有超过 215-1 的值都将被截断为该值。在这里阅读如何做到这一点:http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html

或者你更喜欢它存储更大的整数值?如果是这样,请将您的列更改为 INT

或者您更喜欢当您的@i 超过 215-1 时引发错误?如果是这样,这就是它现在的行为。


你的评论:

首先,INT(11)INT(2)INT(327) 没有任何不同。 number 参数只是显示宽度的提示,它与INT 将存储的位数无关。查看我对Types in MySQL: BigInt(20) vs Int(20)的回复

您说将列类型更改为INT 后仍然遇到相同的错误。 @i 的值是多少?收到错误后运行此查询:

SELECT @i;

【讨论】:

  • 更改为 INT 并设置为 11 位也会引发相同的错误
【解决方案2】:

我认为问题是 @i 没有在这段代码中初始化:

if(!$db->query('SET @i:=0')) {
    $sdl->log('- Error: Some Error OutputCONTINUE');
}
else {
    $sql = 'UPDATE user
            SET user_rank_points = (@i := (@i + 1))
            WHERE user_active=1 ORDER BY user_points DESC';

    if(!$db->query($sql)) {
        $sdl->log('- Error: Some Error Output');
    }
}

因为如果我在 PHPMYADMIN 的 SQL 编辑器中输入两行代码,则执行代码不会出现问题

【讨论】:

  • 有道理,这在 MySQL 5.6 上进行了复制,与 MySQL 5.7 不同,它确实有一个 SQL 小提琴。
【解决方案3】:

我找到了使用 mysqli_multi_query() 而不是 mysqli_query() 的解决方案

$sql='SET @i;';
$sql.='SET user_rank_points = (@i := (@i + 1))
      WHERE user_active=1 ORDER BY user_points DESC';

$link = mysqli_connect("localhost", "my_user", "my_password", "world");
mysqli_multi_query($link,$sql);

我不知道这是否是一个安全的解决方案,但它完成了我的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 2021-11-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多